Eventhandler (Miniversion)

Ich glaube er meint wenn User1 vor User2 online kommt aber nach dem Kampf.

Hier gibt es kein Problem, weil der Kampf auch berechnet werden muss wenn User1 online kommt und er somit auch zu spät wäre um seine Rohstoffe zu sichern.

Befasse mich schon eine Weile mit Browsergames und bin inzwischen der Meinung, dass ein ausgelagerter Eventhandler als Deamon keine schlechte Idee ist.

Hierbei kann man ihn so schreiben, dass er nicht jede Sekunde prüfen muss. Man hat Dinge die eine bestimmte Zeit brauchen, hiervon nimmt man das, welches am wenigsten Zeit braucht. Nun schaut man noch welche Zeit das nächste Event hat.
Nun kann der Eventhandler entweder bis zum nächsten Event schlafen, aber höchstens solange wie die kürzeste Zeit die eine Sache benötigt.

Gruß
 
Nun kann der Eventhandler entweder bis zum nächsten Event schlafen, aber höchstens solange wie die kürzeste Zeit die eine Sache benötigt.

Darauf bin ich gestern abend dann auch noch gekommen. Es ist doch auch möglich, so wie du es sagst, aus der Datenbank den Zeitpunkt des nächsten Events auszulesen und den EH solange per Sleep schlafen zu lassen, alles auszuführen und dann den Eintrag aus der DB zu löschen und wieder auslesen bis wann der EH schlafen muss.
Zum Thema Kampf: Das wäre so auch möglich, da ich kein Weltraumspiel geplant hatte und somit keine TFs etc. entstehen...damit könnt ich mir das mit dem sekündlichen Abfragen auch sparen und einfach solange warten bis ein User online geht.
 
Du musst allerdings darauf achten, dass zwischen dem jetzigem Event und dem nächsten Event wieder ein Event in die Datenbank eingetragen werden könnte.

Beispiel:
Event1 wurde gerade abgearbeitet - 09:30 Uhr
Event2 ist um 09:35 Uhr und bis dahin schläft der EH
Event3 wird nun von einem User um 09:32 ausgelöst und soll nach einer Minute fertiggestellt werden also um 09:33 Uhr

Das Problem ist nun, dass Event3 erstmal nicht beachtet wird, da der EH schläft, deswegen wurde ich immer nur solange schlafen wie nichts passieren kann. Also wenn jedes Event mindestens 1 Minute braucht, sollte dein Eventhandler maximal 1 Minute schlafen.

Kampf:
Auch hier kannst du den Eventhandler benutzen, da ein Kampf ja auch ein Event ist. Ich würde alles in Events machen (Gebäude ausbauen, Einheiten ausbilden, Einheiten verschicken, forschen, Kämpfe usw.). Wenn deine Kämpfe etwas größer sind, dann würde ich das ganze vielleicht noch auslagern (vielleicht in ein C++ Programm welches die Berechnungen übernimmt, ist einfach schneller wie PHP denke ich). Also der Kampf könnte dann in ein Child Prozess des EH ausgelagert werden um die eigentlichen Arbeiten des EH nicht zu beeinflussen.
Habe mich bis jetzt nur theoretisch damit befasst und selber noch nichts praktisches in die Richtung programmiert. Allerdings von einem Open Source Browsergame habe ich den Eventhandler schon durchgeschaut und ein wenig angepasst.

Du solltest dich entscheiden, ob du es per Klicks machst (Vorteil: Du brauchst eigentlich nur Webspace mit PHP und keinen vollen Shell Zugang Nachteil: In meinen Augen höherer Programmier Aufwand) oder per Eventhandler (Vorteil: Zentrale Steuerung von Ereignissen und regelmäßiges arbeiten. Nachteil: Shell Zugang erforderlich). Einen Mischmasch um Kämpfe erst bei Klicks zu berechnen und andere Dinge per Eventhandler würde ich nicht empfehlen.
 
Doch was ist wenn User1 offline ist und von User2 angegriffen wird, [...] Oder lieg ich da jetzt falsch?
Auch das ist imho kein Problem.
Sobald einer beiden User online geht müssen für beide User die Daten, die sie zum Beginn des Kampfes hätten, ausgerechnet werden.
Danach wird der Kampf - wieder für beide - an sich berechnet.
Das sind Ausnahmen, die man einfach beachten muss.

Nur um einem Missverständnis aus dem Weg zu gehen: Ein Eventhanler an sich ist toll - nur bitte nicht in PHP. ;)

Du solltest dich entscheiden, ob du es per Klicks machst [...] oder per Eventhandler [...]. Einen Mischmasch um Kämpfe erst bei Klicks zu berechnen und andere Dinge per Eventhandler würde ich nicht empfehlen.
Auch das sehe ich wieder anders. :D
Um z.B. einen Markthandel umzusetzen, braucht es keinen Eventhandler, da alles sofort berechnet wird. Das kann man auch gleich beim Seitenaufbau durchführen. (Das wäre eine gute Stelle für AJAX, die dem Verkäufer sofort anzeigt das etwas verkauft wurde, ohne das er die Seite erst aktualisieren muss. Nur am Rande erwähnt, weil es mir gerade auffällt.)

Bei zukünftigen Aktionen wiederum, wie z. B. die besagten Kämpfe, ist es wieder sinnvoll dem Eventhandler zu sagen, dass er zur Zeit X diesen ausführen soll.


Da sieht man, es gibt viele Möglichkeiten und auch genau so viele Meinung, wie man etwas umsetzen könnte.
Ich möchte auch nicht sagen das mein Vorschlag besser ist als die anderen - es ist nur meine Meinung. :)
 
Jep sicher du hast Recht, es gibt auch Dinge die man per Klick lösen kann.
Ich habe bei meinem Post nur an die zukunftigen Dinge gedacht wie einen Kampf oder der Ausbau von Gebäuden.
Ich meine er soll nicht so einen Mischmasch machen indem er sagt, dass Kämpfe per Eventhandler ausgeführt werden und der Ausbau von Gebäuden dann per Klick (der Ausbau von einem produzierenden Gebäude kann sich ja auch auf den Kampf auswirken, falls ein Angreifer Rohstoffe klauen kann.

Auch das ist imho kein Problem.
Sobald einer beiden User online geht müssen für beide User die Daten, die sie zum Beginn des Kampfes hätten, ausgerechnet werden.
Danach wird der Kampf - wieder für beide - an sich berechnet.
Das sind Ausnahmen, die man einfach beachten muss.
Und genau da sehe ich den Vorteil von einem Eventhandler. Man muss nicht ganz so stark darauf achten, dass die Daten von den Usern aktuell sind wenn sie sowieso vom Eventhandler bearbeitet werden, dann kann man davon ausgehen dass diese aktuell sind.

Nur um einem Missverständnis aus dem Weg zu gehen: Ein Eventhanler an sich ist toll - nur bitte nicht in PHP.
Sehe ich auch so. Habe schon einen in PHP gesehen und bearbeitet. Nicht wirklich sinnvoll
 
Moin,

ich habe zwar recht wenig Ahnung von Browsergames, allerdings kenne ich die Problematik mit dem Event Handling ganz gut.

Eine Methode das ganze per AJAX zu realisieren ist ja das hier auch schon erwähnte "Polling", also z.B. 1 mal pro Sekunde die Events vom Server abfragen. Das führt natürlich zu 60 Anfragen pro User pro Minute, also eine ganze Menge, je mehr User gerade online sind. Ausserdem gibt es eine durchschnittliche Verzögerung der Events um 0,5 Sekunden, was ja hier wahrscheinlich nicht schlimm ist.

Es gibt allerdings eine Methode, um die Verzögerung deutlich zu reduzieren (bis in den Millisekundenbereich, falls nötig) und gleichzeitig die Anzahl der Anfragen an den Server auf ca. 1 Anfrage pro User pro Minute zu reduzieren. Der Ansatz dazu nennt sich "Reverse AJAX" bzw. "AJAX Push". Hier findet ihr ein paar Beispiele dazu.

Es sei allerdings darauf hingewisen, dass durch dieses Verfahren zwar die Anzahl der HTTP Anfragen dramatisch reduziert wird, aber die Serverbelastung trotzdem hoch sein wird, da viele gleichzeitige Verbindungen aufrecht erhalten werden müssen.
 
Zuletzt bearbeitet:
Ich habe bei meinem Post nur an die zukunftigen Dinge gedacht wie einen Kampf oder der Ausbau von Gebäuden.
[...](der Ausbau von einem produzierenden Gebäude kann sich ja auch auf den Kampf auswirken, falls ein Angreifer Rohstoffe klauen kann.
Ja ich hatte erstmal nur daran gedacht Gebäude auszubauen, später sobald das mit den Kämpfen läuft, will ich die Möglichkeit Rohstoffe zu klauen mit zu implementieren.
Und genau da sehe ich den Vorteil von einem Eventhandler. Man muss nicht ganz so stark darauf achten, dass die Daten von den Usern aktuell sind wenn sie sowieso vom Eventhandler bearbeitet werden, dann kann man davon ausgehen dass diese aktuell sind.


Sehe ich auch so. Habe schon einen in PHP gesehen und bearbeitet. Nicht wirklich sinnvoll
Joa, da ich nur nicht die Kenntnisse in C++ habe um die Daten aus einer Datenbank auszulesen, wollte ich erstmal klein und mit php anfangen.
Einen Linuxserver mit Shellrechten bekomme evtl zur Verfügung, daher ist das kein Prob, das ganze als Prozess laufen zu lassen
 
Ich denke zum Üben ist es nicht schlecht, allerdings solltest du dich dann bald nach einer anderen Möglichkeit umschauen ausser PHP.

Ich würde bei deinem Eventhandler auf eine Event Klasse setzen in der du speicherst, wann das Event stattfinden soll und welche Art von Event es ist, sodass du sowohl Gebäude ausbauen, als auch später Kämpfe usw. dort eintragen kannst
 

Neue Beiträge

Zurück