Sep 21

Browsergame Eventhandler

Tag: Allgemein,EntwicklungPhoscur @ 22:22

Das Thema ist wohl bekannt und wurde, wie man über Google merkt, oft diskutiert. Ich berufe mich deshalb nicht nur auf meine Erfahrung, sondern möchte auch darauf hinweisen, dass man bei Google Ähnliches findet.

Das große Problem:

Bei einem Browsergame wie UGamela läuft die Zeit weiter, wenn der User sich abmeldet. Dem Server ist es sowieso egal, ob der User gerade eine Page liest, es kommt immer nur auf die Momente an, zu denen jemand klickt und Daten nachgeladen werden.

Annäherung:
Das Naheliegendste ist es zu denken, dass die Daten immer aktuell gehalten werden, dann wäre ja alles klar. Aber das ist mit einfachen PHP Scripten nicht möglich und wäre auch arg ressourcenverschwenderisch.

Lösungsvorschläge:
Die Erste und wohl beste Methode wäre es, aus komplexeren Problemen, wie den Flotten, Events, kleine Jobs für einen Daemon, zu machen. Daemon bedeutet ein Script, fast eigenständiges Programm, das permanent läuft und Ereignisse dann abarbeitet wenn sie Geschehen. Diese Möglichkeit wäre eindeutig einfacher, wobei man nurnoch auf sehr seltene Überscheidungen achten müsste (zwei Events zum gleichen Zeitpunkt mit überschneidenden betroffenen Objekten), aber selbst das wäre kein Problem, das es ja nur eine Daemon Instanz gibt, also keine Race Conditions.

Ein solcher Daemon müsste tiefer im System sitzen als ein kleiner PHP Script im Apache Server und sollte nach Möglichkeit in einer schnelleren Programmiersprache als PHP geschrieben sein ( C(/#/++), Java ). Daher ist dafür in jedem Fall mehr als ein einfacher Webspace nötig. [OGame hat nach eigenen Angaben ein C oder C++ basiertes Script und extra Server nur für die Kampfberechnung.]

Damit möchte ich mich nicht zufrieden geben. Früher habe ich UGamela gerne mit phpBB verglichen, aber so einfach ist das dann doch nicht. In einem Forum passiert nichts wenn es nicht ein User direkt tut… Trotzdem will ich den Spagat schaffen, dass das Spiel auch auf einem einfachen Webspace läuft.

Hier mein Ansatz:
Eine Berechnung wird erst dann nötig, wenn die Daten benötigt werden, aber dann muss gründlich berechnet werden. Um die Rohstoffe korrekt zu berechnen habe ich MySQL Prozeduren geschrieben, die das erledigen bevor der Apache überhaupt was von den Daten zu Gesicht bekommt. Bei den Flotten will ich auch nur die berechnen, die gerade relevant sind. Aber ich will keinem user Wartezeiten zur Kampfberechnung aufbürden. Der Einzige, der nicht meckert – außer möglicherweise dem Apachen selber – wenn der Script zu lange braucht und selbst auf einem Webspace zur Verfügung steht, ist der Cronjob. Allerdings höchstens alle zwei Minuten. Nun können wir uns ärgern, dass wir dann die Kämpfe nicht zum richtigen Zeitpunkt berechnen lassen können oder wir schieben die Kämpfe in dieses zwei Minuten Raster. Dann findet der Kampf halt nicht sofort statt wenn die Flotte ankommt, sondern „läuft“ während einer gewissen Zeit, zum Beispiel könnte man eine Runde alle zwei Minuten ausrechnen, der User könnte dies „live“ mitverfolgen und sogar seine Flotte während des Kampfes zurückziehen. Auf jeden Fall ist dies um einiges realistischer als der 10-Sekunden Kampf…

Die meisten anderen Events werden ähnlich wie die Rohstoffberechnung von MySQL Prozeduren abgearbeitet. Nun sorge ich mich langsam nicht mehr um meinen Apachen sondern um meinen MySQL Server… Überlast? .. Ich bin mir da noch nicht sicher, aber ich werde auf jeden Fall mit einem Sessionmanagement aushelfen, teils werden wir gar keine Queries oder Prozeduraufrufe brauchen, hoffe ich.

Ich bitte hier nur die Leute, die wirklich etwas davon verstehen zu posten, ansonsten garantiere ich nicht dafür, dass ich die Kommentare stehen lasse.

5 Kommentare zu “Browsergame Eventhandler”

  1. M0F schrieb:

    „Dann findet der Kampf halt nicht sofort statt wenn die Flotte ankommt, sondern “läuft” während einer gewissen Zeit, zum Beispiel könnte man eine Runde alle zwei Minuten ausrechnen, der User könnte dies “live” mitverfolgen und sogar seine Flotte während des Kampfes zurückziehen.“

    Nette Idee 🙂

  2. Marius schrieb:

    Moin Pleghma,
    nach der Grundidee von einem Eventhandler, der nicht Perfomance tötend ist suchen wir alle.
    Finde die Ansätze nicht schlecht, allerdings merkt man auch bei dieser Idee das grundlegende Spielprinzipe verändert werden müssten.

    Aber trotzdem nette Idee – Bin auf Umsetzung gespannt.

  3. DGLDevil schrieb:

    Wenn ich ehrlich bin, halte ich nicht allzu viel von Ticks. Aber wenn das den Server entlastet, ist das bei einem ordentlichen KS schon in ordnung.

  4. Harvey schrieb:

    Ich bin auch von der Idee begeistert, was wäre wenn man für jede Runde des Kampfes eine 1/4 Stunde (also einen Tick) vergibt, innerhalb der Runde kann man jederzeit abbrechen. Also wenn man 5 Runden annimmt, könnte man so innerhalb von 1 1/4 Stunden den Kampf a) mitverfolgen und b) den Kampf abbrechen! Bin dafür! Ich hab dir auch meine Webseite angegeben. Ich werde in mein Spiel auch Ticks einbauen und den Kampf mit einen PHP Script abbarbeiten, wenn jeder User eine Webseite anzeigt und einen Thread starten mit exec…

  5. Phoscur schrieb:

    Verstehe jetzt nicht ganz was du mit dem Thread über exec vorhast. Soll der dann laufen bis der Kampf eintritt und fertig ist? Hast du das auch für normale Flottenereignisse? Da wäre doch ein Daemon sinnvoller.

    Ich stehe ja immer noch für Konfigurierbarkeit und Flexibilität. Ich denke, in diesem Fall wird man es allen recht machen können. Wer eigentlich keine Ticks will, dem werden sie gar nicht umbedingt auffallen, und die länge einer Runde lässt sich doch auf 0 setzen, dann haben wir wieder den Standardkampf.

Dein Kommentar

Du musst eingelogt sein, um einen Kommentar zu schreiben.