mmofacts.com

Cron's für Eventhandler?

gepostet vor 18 Jahre, 5 Monate von sYnchron
So...
Ich beschäftige mich schon seit einiger Zeit mit diesem Thema. Ich nutze immoment selber nur timestamps aus der DB, was soviel heisst, wie, dass das Game quasi nur läuft wenn der Spieler sich einloggt. Vorher passiert nichts.
Nun gibts da immer so div. Sachen:
Seien zwei Spieler die den selben anderen Spieler in der Nacht angreifen (Spieler b hat seine Flotten aber zuerst losgesendet und diese kommen auhc laut anzeige früher an) und am morgen danach loggt sich Spieler a vor Spieler b ein und dann läuft nachträglich der Att. Spieler a bekommt die ress also und spieler b ncihtsmehr obwohl sie hätten früher da sein sollen.
Das ist nur ein Beispiel von anderen, gibts noch jede Menge, auch bei anderen Bereichen, die relevant sind
Nun habe ich mich langsam in Cron's eingearbeitet und habe gedacht ich baue eine Art Eventhandler der jede x sekunden aktualisiert.
Nun wäre meine Frage hat das schonmal jemand gemacht, wie sind die erfahrungen damit und vllt gibts ja noch ein paar Tipps für mich =D
mfG
sYnchron
gepostet vor 18 Jahre, 5 Monate von mifritscher
Sagen wirs so: ein absolutes Muss.
gepostet vor 18 Jahre, 5 Monate von sYnchron
Und das Intervall für die aktualsierungen?
Sekündlich?!?
gepostet vor 18 Jahre, 5 Monate von mifritscher
Hmm, dein Spiel ist nicht Tickbasierend und so schnell (crons lassen sich normalerweise nur minütlich aufrufen)?
ok, dann würde ich es ein wenig abwandeln:
Starte es nicht vom cron, sondern lasse es dauernd im Hintergrund laufen.
Das Teil läuft dann in einer Endlosschleife, worin eine sleep-funktion steckt, die entweder bis zum nächsten Ereigniss oder z.b. 30 Sek (halt der kleinstmögliche Abstand zwischen Eintragen des Ereignisses und Eintreten des Ereignisses, z.B. min. Bauzeit,Flugzeit etc.) wartet, je nachdem was kleiner ist.
gepostet vor 18 Jahre, 5 Monate von sYnchron
Nein mein Spiel läuft Echtzeit
Dann wäre aber doch der Eventhandler wieder vom Spieler selbst abhängig, oder?
gepostet vor 18 Jahre, 5 Monate von Moogly
Du musst die Spielerechtzeitberechnung so umbauen, dass der Spieler nicht nur seine aktuellen Ereignisse errechnet, sondern nach der Uhrzeit vorgeht und alle Ereignisse vor seinem auch errechnet. Habe ein solches System in meinem Spiel(Entwicklungsphase) eingebaut. Nun musst du aber gut überlegen wie du die Events rechensparend abhandelst und verteilst.
Sinnlos:
Ein User rechnet immer alle anstehenden Events bei einem Reload ab.
Sinnvoll:
Der User rechnet alle Events bis zu dem eigenen angeforderten Event ab.
Hoffe ich konnte dir helfen.
Gruß
Moo
gepostet vor 18 Jahre, 5 Monate von mifritscher
Nein, bei meiner Version läuft der EH(Eventhandler) ständig im Hintergrund, (z.B. über eine shell gestartet) nur statt sekündlich oder so nach neuen evenuts zu schauen optimiert er es halt bissle
gepostet vor 18 Jahre, 5 Monate von Sarge
Ein Fall wie von Dir beschrieben darf wenn du das ganze über Timestamps realisierst nicht auftreten. Da hast du ein Fehler in deiner Eventberechnung drinnen.
Auf crons solltest du mit richtiger Eventberechnung getrost verzichten können. Das einzige ist wenn du lange Zeiten hast inder sich keiner einloggt das du damit das aufstauen der Events minimieren kannst.
Also ein möglicher Zusatz aber die meiste Arbeit sollte dein Eventbehandlung durch den Spieler ohne probleme selbst schaffen.
gepostet vor 18 Jahre, 5 Monate von zufall_
ganz ohne crons gehts leider nicht, aber sie sollten sehr überlegt eingesetzt werden.
ich verwende 3 systeme für events:
1) ein skript, das dauernd im hintergrund läuft und zeitkritische sachen wie flottenevents sekundengenau erledigt.
2) ein ereignisorientiertes sytem, das zb. rohstoffe vor einem angriff oder bei aufrufen des planeten aktualisiert.
3) einen cron, der ab und zu schaut, ob nicht irendwas "übriggeblieben" ist und ob das skript aus 1) noch läuft/funktioniert.
der cron ist zb. nur für den fall zuständig, das ein user ein gebäude in auftrag gibt und offline geht. die gebäude werden üblicherweise beim aufruf des gebäudemenus aktualisiert. mann könnte es zwar so machen, das auch der aufruf eines belibigen users alle gebäude aktualisiert, aber darauf möchte ich mich nicht verlassen.
gepostet vor 18 Jahre, 5 Monate von Kallisti
Es geht schon ohne, nur hast du dann in Peakzeiten - wo der Serverload sowieso schon so hoch ist wie sonst nie - noch eine weit hoehere Auslastung, da alle Events zusammentreffen.
Hinzu kommt, dass die Verschachtelung teilweise echt boese werden kann, je mehr Moeglichkeiten dein Spiel bietet (Beispiel: Spieler A greift Spieler B an, die Flotte startet um 00:00, waere um 01:00 da und um 02:00 zurueck. Um 03:00 greift Spieler C Spieler A an, dieser hat sich jedoch nicht eingeloggt. Seine Flotten muesste zurueck sein -> ist sie es?). Das laesst sich beliebig weiter verketten...
Ich denke wenn das Spiel halbwegs effizient sein soll, kommt man um einen Daemon nicht herum.
gepostet vor 18 Jahre, 5 Monate von Kapsonfire
also ich würd ma sagen ei dwen attacks einfach nach der ankunftszeit berechnen
heisst spieler b kommt zuerst an also spieler b erst den attack berechnen
da dies aber dazu führt das ressourcen vor dem kampf berechnet werden würde ich ma so sagen
cronjobs auf alle 15 minuten xD
achja bei echtzeit würde ich echt auf eine ,exe datei umstellen (sprich c++ welches vom server morgens bis abends läuft)
gepostet vor 18 Jahre, 5 Monate von zufall_
für was eine exe?
ein einfaches php skript, welches in einer endlosschleife mit wait läuft verursacht selbst bei im sekundentakt eintreffenden flotten keine nennenswerte last (selbst auf einem schwachbrüstigen v-server).
das skript, welches ich verwende fragt die flottentabelle ab und passt je nach dem, ob in naher zukunft ein flottenereignis ansteht, daß nächste wait an. wenn ein flottenereignis fällig ist, wird der flotteneventhandler gestartet welcher dann diese flotten "abarbeitet".
gepostet vor 18 Jahre, 5 Monate von Kapsonfire
naja aber eine datei auf c++ basis wäre wirklich besser da php nciht für 24% betrieb ausgelegt ist (also das eine datei 24 std lang ausgeführt wird)
gepostet vor 18 Jahre, 5 Monate von zufall_
es gibt einige unterschiede zwischen cli-php und apache-php. die cli skripe beispielsweise, sind üblicherweise nicht in der laufzeit beschränkt. mein php event-skript läuft seit jahren auf mehreren servern problemlos. es wird zwar von einem per cron gestarteten skript kontrolliert und bei bedarf neu gestartet, aber das ist bisher noch nicht vorgekommen.
gepostet vor 18 Jahre, 5 Monate von General Crime
Ist vieleicht eine blöde Frage aber mus ich leider stellen!
Ich kenne mich nicht so gut mit cronjobs aus habe dieser derzeit über einen Anbieter laufen welche meine PHP Scripte immere zu xxx aufruft!
Wie mus eine Crontab datei heißen oder besser was mus da drinne stehen das diese ein x belibiges PHP Script startet!
Würde mich um eine Antwort freuen!
zb. Datei :cron.das
Text:
asrg.php
gepostet vor 18 Jahre, 5 Monate von General Crime
blödheit tut weh muss ich sagen!
Ich nehem aber das 3 ergebnis weil da gehts darum was ich auch vorhabe!
THX und sorry das ich ins Thema geplatzt bin!
PS: Finde auch das es ohne Crons nicht geht da sie vieles am laufen halten auch wenn kein User Online ist!

Auf diese Diskussion antworten