Gamux Game Entwicklung  
     

Left Nav Mit Facebook verbinden Registrieren Lexikon Lexikon Interessengemeinschaften Suchen Heutige Beiträge Alle Foren als gelesen markieren Right Nav

Left Container Right Container
 
Alt 10.12.2008, 08:58   #1 (permalink)
Neuer Benutzer
 

leiunn eine Nachricht über ICQ schicken
Standard Timer serverseitig laufen lassen

Hallo,

ein Kumpel und ich wollen schon seit einiger Zeit ein Browsergame erstellen.
Das Konzept und so weiter steht schon alles soweit.

Jetzt haben wir uns Gedanken über einige technische Aspekte gemacht und da ist uns eine Frage aufgekommen.

Welche möglichkeiten gibt es Timer Serverseitig ablaufen zu lassen?

Bsp: Ein Spieler will ein Gebäude bauen. Das soll ja dann nicht sofort passieren sondern einige Zeit dauern.
So der Spieler hat den Bauauftrag gegeben und sich dann ausgeloggt. Das die Fertigstellung des Gebäudes sich auf die Spielerstatistik auswirkt, soll beim Aufgeben des Bauauftrages auf dem Server ein Timer gestartet werden, der nach ablaufen der Zeit das Gebäude in der DB als fertiggestellt markiert und die Statistik des Spielers aktualisiert.

Mich würde jetzt interessieren welche möglichkeiten es gibt sowas zu realisieren.

Hoffe ihr könnt uns helfen.

Regards
Leiunn
leiunn ist offline   Mit Zitat antworten An Facebook senden
Werbung
Alt 10.12.2008, 10:03   #2 (permalink)
Erfahrener Benutzer
 

Standard

Zum einen gibt es die Möglichkeit einen Cronjob laufen zu lassen, der dir dann immer (z.B. alle 5 Minuten) überprüft, ob ein Gebäude fertig ist und die Statistik aktualisiert.

Zweite Möglichkeit:
Du speicherst das End Datum in der Datenbank und sobald jemand auf Statistik klickt, wird erstmal geschaut, ob das jetzige Datum größer dem Datum in der Datenbank ist, ist dies der Fall wird das Gebäude dem Spieler gutgeschrieben und die Statistik aktualisiert.
Megger ist offline   Mit Zitat antworten An Facebook senden
Alt 10.12.2008, 12:30   #3 (permalink)
Neuer Benutzer
 

leiunn eine Nachricht über ICQ schicken
Idee re

hey,
danke für die antwort.

zu den cronjobs hab ich 2 sachen die dagegen sprechen.
1. ist die ganze sache sehr serverlastig da die ausführung in sehr kurzen zeitabständen immer gemacht werden müsste.
2. hab ich auf meinem webspace die möglichkeit der cronjobs nicht xD

zur lösung mit der Datenbank:
das hab ich mir inzwischen auch überlegt. allerdings nicht ganz so wie du beschreiben hattest.

meine aktuelle lösung wäre folgende:
in der DB eine Tabelle "Actions". dort werden alle aktionen mit dem enddatum gespeichert.
bei jedem login oder reload der seite (egal von welchem spieler) wird ein PHP script aufgerufen das über ein SQL statement alle einträge aus der db ausliest, bei denen das enddatum älter ist als die aktuelle serverzeit.
diese einträge werden dann einer nach dem anderen abgearbeitet und aus der actions tabelle gelöscht sobald sie erledigt sind.

bleibt noch ein problem: was ist wenn mehrere zur gleichen zeit neu laden und das php script mehrmals aufgerufen wird?

lösung:
eine weitere Tabelle "flags" wo ein flag hinterlegt wird ob "actions" gerad bearbeitet wird. steht dieses flag auf 1 soll das php script abbrechen. steht fas flag auf 0 ändert das phpscript das flag auf 1, macht die oben beschriebenen aktionen und ändert ganz am ende das flag wieder auf 0.

damit sollte es eig ganz gut funktionieren und die gefahr der zugriffsverletzungen in der db relativ gering gehalten werden.

wohlbemerkt ist das ganze bisher nur theorie bei mir aber ich werds testen =)

gruß,
leiunn
leiunn ist offline   Mit Zitat antworten An Facebook senden
Alt 10.12.2008, 13:52   #4 (permalink)
Erfahrener Benutzer
 

Standard

Die Actions-Tabelle halte ich persönlich für schwachsinnig. Zugriffe, die gar nicht sein müssen.

In der Gebäude Tabelle machst du 2 Felder

- UpgradingTo
- UpgradeEnd

In UpgradingTo schreibst du rein, auf welche Stufe ein Gebäude upgegradet wird. In UpgradeEnd schreibst dud en Timestamp, wann das Upgrade vollzogen ist.

Geht ein User nun auf die Seite, wo all seine Gebäude dargestellt werden, fragst du ja sowieso UpgradingTo und UpgradfeEnd ab um den aktuellen Status des Upgrades dem User zu zeigen.

Nun tritt das ein, was Megger schon gesagt hat. Ist die Zeit von UpgradeEnd kleiner als die aktuelle Zeit wird UpgradeEnd und UpgradingTo geleert, das neue Gebäude Level gesetzt und der User kann neu upgraden.

Logischerweise auch nur die notwendigen Felder abfragen um dies so gering wie möglich zu halten.

Mit Ajax kannste dann wahlweise noch alle X Sekunden den Status abfragen.



//Edit: Ok, Profimeinung reingeholt. UpgradingTo ist schwachsinnig. Man braucht als nur UpgradeEnd.


Geändert von Sn0opy (10.12.2008 um 13:59 Uhr).
Sn0opy ist offline   Mit Zitat antworten An Facebook senden
Alt 11.12.2008, 10:17   #5 (permalink)
Erfahrener Benutzer
 

Standard

Und ich würde auch nie immer alles abfragen, stell dir mal vor du hast 20.000 Spieler und alle bauen ein Gebäude, welche alle dann auch schon fertig sind (also Endzeit < Now) nun hat ein Spieler die Arschkarte gezogen, da er zuerst wieder auf die Seite zugreift und damit alle Gebäude der 19.999 anderen Spieler auch noch mit aktualisiert, obwohl er eigentlich nur seine eigenen Gebäude sehen will.

Ich habe bei mir eine eigene Tabelle, darin ist gespeichert um welches Gebäude es sich handelt, zu welchem Land es gehört, wann es gestartet wurde und wann es endet.

Diese Tabelle frage ich eigentlich nur für die eigenen Gebäude des Spielers ab, ausser zum Beispiel beim Kampf, da wird alles rückwirkend auch für den verteidigenden Spieler berechnet.
Megger ist offline   Mit Zitat antworten An Facebook senden
Antwort

Themen-Optionen
Ansicht

Forumregeln
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:36 Uhr.


Style Copyright by Wrestling Forum
Content Relevant URLs by vBSEO 3.3.0