[Browsergame] Datenbankänderung ohne das der Nutzer die Seite aufruft

daniel_sun

Erfahrenes Mitglied
Hi all,

habe eine Frage, auf die ich bisher noch keine Antwort gefunden habe. Jeder kennt bei Browsergames die Countdowns nachdenen dann etwas passiert (auch wenn der Spieler nicht online ist).

Wie der Countdownfunktioniert und später der Aktuelle angezeigt wird weis ich. Meine Frage ist nun wie wird das gelöst das nach dem Countdown etwas passiert selbst wenn keiner online ist.

Hatte an erst an Cronjob gedacht aber geht das? Ich meine man kann doch nicht jede Sekunde ein Script laufen lassen das für jeden Benutzer prüft ob die endzeit in der DB erreicht ist. Das würd doch den Server vollkommen überlasten wenn man nachher 10.000 User hat oder?

Mir gehts weniger um ein genaues Script eher um die theorie!

Danke im vorraus!

Gruß
Daniel_sun
 
Um ehrlich zu ich bin nicht so der Spieler und kenne die Countdowns jetzt nicht.

Aber die Änderungen betreffen doch wohl immer den Spieler selber, dann kannst du doch einfach wenn er online geht prüfen ob ein Countdown abgelaufen ist oder nicht. Wenn ja wird das Spiel mit den entsprechenden Änderungen gestartet, wenn nicht bleibt es wie es ist.

Wenn ich das jetzt falsch verstehe, dann beschreiben mal eine Situation wo etwas passiert obwohl der Spieler nicht aktiv ist.
 
ich kenn die Situation ;)
Was ist, wenn Spieler A gerade Einheiten baut, dann offline geht und anschließend angegriffen wird. :) oder es ein Ranking gibt.

Denke schlecht wäre es nicht, wenn man so etwas direkt am Server(java?) löst.
 
Die Methode die tombe vorgeschlagen hat kann zu Problemen führen und wird ggf etwas kompliziert.
Du brauchst 2 Tabellen: Eine mit allen Countdown.
Die andere füllst du nur mit den Countdowns der nächsten X Sekunden. X Steht dabei für die Geringste Bauzeit/Forschungszeit. Diese Tabelle ratterst du dann jede Sekunde durch.
 
@tombe: Nach deine Methode habe ich die aktualisierungen wenn ich online gehe aber es spielen ja auch andere das spiel

Beispiel:

Ich habe auf meinem Planeten 3 Raumschiffe. Nun logge ich mich ins System ein und gebe den Auftrag 5 weitere zu Bauen. Jedes Schiff hat eine Bauzeit von einer Stunde. Ich logge mich aus. Nach 2 Stunden greift mich ein andere spieler Spieler an.
Nach deiner Methode hätte ich nun trotzdem nur 3 Schiffe zur verteidigung ob wohl (in meiner Abwesenheit) 2 weitere Fertig gestellt wurden.
Daher muss irgendwie in der DB immer die aktuellen Werte an Schiffen oder Ressourcen in der DB stehen. Da ja auch Szenarien in meiner Abwesenheit (wie z.B. ein Angriff) berücksichtigt werden müssten.
 
Cronjob und eine Inteligente Datenbank.
In der DB eine Tabelle mit Jobs die einen Termin haben. Alle 5 Sekunden alle abgelaufenen Jobs abarbeiten und entfernen.

Wenn du 10'000 User hast, dann hast du vorerst ganz andere Probleme als die Performance beim Cronjob.
 
Würde es nicht auf gehen das man eine Aktualisierungsfunktion schreibt die für Spieler_ID XY alles aktuellen werte berechnet (Rohstoffe, Schiffe, Gebäude ect.) und diese funktion immer aufruft wenn man sich einloggt oder ein anderer spieler mit einem in interaktion tritt

Also beim Angriff erst die funktion Aktualisierung (damit alles auf dem neuesten Stand ist) und dann den angriff?

Ist mir gerade so eingefallen?!
 
Hi,

bei meinem Browsergame Versuch bin ich fast komplett ohne Cronjobs ausgekommen.
Das, was du erreichen willst, kannst du auch so lösen wie von jannicars kurz angeschnitten.

Bei jedem Seitenaufruf von Spieler X überprüfst du alle Aufträge von Spieler X, ob dieser fertig sein sollen. Erfolgt nun ein Angriff oder sonst was, dann musst du nicht nur die Aufträge von Spieler X, sondern auch die Aufträge von Spieler Y überprüfen, bevor die Aktion durchgeführt wird.

Somit hast du nur Load, wenn die Spieler online sind, bzw. untereinander agieren.

Gruß
BK
 
Zurück