Ankündigung

Einklappen
Keine Ankündigung bisher.

Browsergame Eventmanagement

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Browsergame Eventmanagement

    Hallo,

    mein Problem ist folgendes:

    Ich hatte vor, just 4 fun, ein kleines Browsergame zu basteln und an sich habe ich eigentlich genug Kenntnisse um dies zu bewerkstelligen, allerdings:

    Wie soll man die Events genau handeln?

    Ich hatte mir es eig vorgestellt, dass alles was man so macht ( Gebäude fertig in 5h, z.b. ) halt als Event in einer Datenbank gespeichert wird und halt ein Prozess dann immer guckt welches Event gerade anfällt und dann dieses berechnet sobald der Zeitpunkt gekommen ist.

    Um das genauer zu definieren: User clickt Gebäude bauen(5h dauer) -> Event geht in die Event DB, nach 5h berechnet Prozess XYZ das Event und setzt in der UserDB von dem user das gewählte Gebäude eine stufe höher.
    Oder: User greift anderen User an, angriff erfolgt nach 6h, auf exakt diesem Zeitpunkt dann wird berechnet, wie der Angriff erfolgt ( Angreifer VS Verteidiger ) etc.

    Erste Idee war ein Cronjob, der halt alle 10s ( 30s wäre .. unbefriedigend ) läuft und alle anfallenden events bewerkstelligt.

    Prob ist nur: das ist ... eklig und das lässt sich nicht mit den üblichen anbietern abkaspern ....

    alle anderen ideen sind noch unsauberer :-/

    Habt ihr hier Ideen?

    Stehe da gerade etwas mit einem großen Fragezeichen überm Kopf, beim rest weiß ich ziemlich exakt wie ichs umsetzen würde.

    Liebe Grüße und danke für nützliche Antworten!


  • #2
    Berechne nur dann das Ergebnis, wenn es angefordert wird. Wenn es niemand ansieht, ist es doch egal, was in der Datenbank steht. Wozu ständig Daten aktualisieren, die niemand sieht?

    Kommentar


    • #3
      Zitat von hellbringer Beitrag anzeigen
      Berechne nur dann das Ergebnis, wenn es angefordert wird. Wenn es niemand ansieht, ist es doch egal, was in der Datenbank steht. Wozu ständig Daten aktualisieren, die niemand sieht?
      Problem:

      Spieler A greift Spieler B an. Zeitpunkt des Angriffs: 3 Uhr nachts. Spieler B schickt seine Armee weg damit sie nicht zerstört wird, sie kommt auf 13 Uhr nachmittags wieder. Beide Spieler gucken erst um 16 Uhr wieder rein.

      Spieler A freut sich, dass er vieles zerstört hat, Spieler B fragt sich warum der Angriff von 3 Uhr Nachts seine Armee, die um 13 Uhr wieder kam, zerstört hat.


      Das kann man mit leider vielen Beispielen machen ....

      Daher wäre es wirklich notwendig, dass exakt zu dem Zeitpunkt das Event berechnet wird.

      Kommentar


      • #4
        Du musst die Aktionen schon noch in der richtigen Reihenfolge ausführen. Du kannst auch mit queues arbeiten, die entsprechende Events sofort bearbeitet, wenn sie verfügbar werden, dann hast du bei einem Seitenaufruf nicht das problem, eventuell erst die gesamte Nacht mit Schlachten, Verlusten, Truppenbewegungen etc. durchzusimulieren.

        Kommentar


        • #5
          Zitat von alxy Beitrag anzeigen
          Du musst die Aktionen schon noch in der richtigen Reihenfolge ausführen. Du kannst auch mit queues arbeiten, die entsprechende Events sofort bearbeitet, wenn sie verfügbar werden, dann hast du bei einem Seitenaufruf nicht das problem, eventuell erst die gesamte Nacht mit Schlachten, Verlusten, Truppenbewegungen etc. durchzusimulieren.
          exakt das suche ich ...

          könntest du mir ein beispiel für solche queues geben?

          es soll halt exakt bearbeitet werden sobald das event "abläuft"

          Kommentar


          • #6
            Zitat von Alexy Beitrag anzeigen

            exakt das suche ich ...

            könntest du mir ein beispiel für solche queues geben?

            es soll halt exakt bearbeitet werden sobald das event "abläuft"
            Naja du brauchst eine Tabelle

            id | EventName | userId | additionalData | expires

            wenn ein User auf eine Webseite geht, rufst auf

            SELECT * FROM eventQueue WHERE userId = $userId and expires <= NOW() ORDER BY expreis;

            und in einer Foreach führst du die Events aus. Es gibt zb call_user_func_array damit kannst du aus einem Text eine Klasse mit ihrer Methode aufrufen und in additionalData kannst du ja Parameter für die Methoden abspeichern.

            Es wird nichts extakt bearbeitet wenn etwas abläuft, sondern das ergebnis wird nur dann angezeigt, wenn es gerade gebraucht wird. Du könntest noch zb einen Täglichen CronJob ausführen der alle Events für alle user mal ausführt, damit die Tabelle auch mal geleert wird.


            Zu deinem Problem

            Spieler A greift Spieler B an. = ein Eintrag in die eventQueue Tabelle, musst ausrechnen wann die EInheiten eintreffen werden

            Spieler B schickt seine Armee weg damit sie nicht zerstört wird, sie kommt auf 13 Uhr nachmittags wieder. = Wieder ein Eintrag in die Event Queue

            Beide Spieler gucken erst um 16 Uhr wieder rein.= Egal wer zu erst online kommt, bei einem wird dann eine komplexe Berechnung ausgeführt, bei anderem ist schon alles berechnet und die Event queue ist leer abgelaufen

            Natürlich reicht da in Angriffszenarien nicht nur ein Event aus.

            Wenn spieler A den Spieler B angreift, musst du dann für Spieler A den "Ankommen der Truppen" event eintragen und für Spieler B "Kalkulation der Rohstoffe" und "Anpassung der Verluste" halt irgendwie so, versuch nicht zu viele aktionen in ein Event zu packen, nenn es nicht "Angriff" so kannst später viele Bausteine miteinander kombinieren bei einer Aktion.
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp

            Kommentar


            • #7
              Zitat von hellbringer Beitrag anzeigen
              Berechne nur dann das Ergebnis, wenn es angefordert wird. Wenn es niemand ansieht, ist es doch egal, was in der Datenbank steht. Wozu ständig Daten aktualisieren, die niemand sieht?
              Eine allgemeingültige Aussage finde ich falsch. Das kommt eben drauf an. Gewisse Dinge sind im Nachhinein sehr schwer zu berechnen (z.B. ergatterte Rohstoffe bei einem Angriff, da der Bestand dank Produktion über die Zeit steigt, oder auch sinkt wenn zeitgesteuert Bauten starten). Gewisse Dinge sind sehr einfach im Nachhinein zu berechnen (irgendwelche Punktzahlen, Ranglisten, ...).

              Wenn du skalierst und mit mehreren 1'000 aktiven Spielern pro Tag rechnest ist verzögert ~= echtzeit und somit ist Echtzeit sicher einfach zu implementieren.

              Dann gibt es sehr viele Lösungen wie MessageQueues und sonstiges, um die Arbeit auch verteilt ausführen zu können.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                Zitat von ChristianK Beitrag anzeigen

                Eine allgemeingültige Aussage finde ich falsch. Das kommt eben drauf an. Gewisse Dinge sind im Nachhinein sehr schwer zu berechnen (z.B. ergatterte Rohstoffe bei einem Angriff, da der Bestand dank Produktion über die Zeit steigt, oder auch sinkt wenn zeitgesteuert Bauten starten). Gewisse Dinge sind sehr einfach im Nachhinein zu berechnen (irgendwelche Punktzahlen, Ranglisten, ...).

                Wenn du skalierst und mit mehreren 1'000 aktiven Spielern pro Tag rechnest ist verzögert ~= echtzeit und somit ist Echtzeit sicher einfach zu implementieren.

                Dann gibt es sehr viele Lösungen wie MessageQueues und sonstiges, um die Arbeit auch verteilt ausführen zu können.
                Naja, wenn man ein Angriff in ein Event legt, dann ist es schwierig, erstllt man aber bei einem Angriff mehrere Events und jeder macht nur sein Teil, wird es dann doch einfacher. Natürlich muss man bei einem Angriff, noch befor er stattgefunden hat, die Events des Opfers abarbeiten, damit sich seine Rohstoffe, Gebäude, Einheiten,Forschungen etc auf den Aktuellen Wert berechnet werden, danach kommt der Angriff, und danach kann weiter gerechnet werden.

                Das Problem an MQ und sonstiges, es verlangt sehr viel Wissen voraus, du musst die Server ja noch via Docker einstellen und zusehen dass die Infrastruktur läuft, da wird das nichts mehr mit "Ich hab mir Xampp installiert und will jetzt ein BG Proggn". Die, die sich damit auskennen, würden sowieso kein BG in der Freizeit programmieren.

                Die Aussage mit den Events ist die möglichst einfachste Variante, denn selbst ein kleiner Cron unter Xampp ist nicht einfach mal so gemacht.
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp

                Kommentar

                Lädt...
                X