Entwicklerblog: Es ist Zeit für einen neuen Timer

veröffentlicht am 04.05.2023

Willkommen zum ersten Blogbeitrag zur Neuentwicklung von GigraWars. Wir widmen uns heute einem Problem, welches den Hardcore Spielern besonders immer wieder aufgefallen sein wird. Es geht um die Zeitberechnung mittels Javascript, welche auch ohne die aktive Kommunikation mit dem Spielserver ein entsprechendes Zeitgefühl vermitteln soll.

Dabei geht es primär um das Herunterzählen von Zeit in den Bauschleifen oder bei den Flotten. Genauso aber auch das korrigieren und Hochzählen der Zeit beim Flottenversand, bis man seine Flotte versendet.

Das Problem

Wir haben hier genau zwei Probleme. Zum einen berechnet der Spielserver seine Zeit und das System des Spielers unabhängig voneinander. Es kann allerdings sein, dass ein Spieler in einer anderen Zeitzone unterwegs ist, dann stimmen die Zeiten so gar nicht mehr. Es geht aber auch eine Nummer kleiner, wenn die Spielserver Zeit minimal von der des Spielers abweicht. In der Vergangenheit haben ein paar Spieler die Zeit am Rechner explizit nicht mehr mit dem Internet synchronisiert, damit die Zeit mit dem Spielserver übereinstimmt.

Das zweite Problem ist die Berechnung des zeitlichen Fortschritts, also das weitere Ermitteln der Zeit im Browser des Spielers. Vereinfacht geht das Javascript im Browser hin und stellt sich einen Wecker, welcher jede Sekunde klingelt und rechnet dann für die innere Uhr plus Eins. Jeder kann sich vorstellen, dass so etwas zwangsläufig schiefgehen muss.

Es fängt schon damit an, dass wenn der Browser genau jede Sekunde entsprechend hochrechnen soll, der Browser nicht garantiert, dies auch exakt zu tun. Wechselt man zwischendurch in ein anderes Fenster oder ist auf dem Gerät gerade viel los, so kann es genauso zu Verzögerungen kommen und schon ist es vorbei mit der schönen Berechnung.

Die Lösung

Jetzt wissen wir, wie es nicht geht, aber wie geht es nun richtig? Fangen wir erst einmal mit der Differenz zwischen dem Spielserver und dem Spieler an. Eigentlich ist der Gedanke hier relativ simpel. Wir berechnen lediglich die Differenz zwischen beiden und haben damit eine nahezu perfekte Basis. Für unser zweites Problem gehen wir nicht mehr hin und zählen jede Sekunde hoch, sondern merken uns die Uhrzeit auf Browserseite und schauen bei jeder neuen Berechnung nach, wie die Differenz ist und rechnen anhand dieser die neue Zeit aus.

Dadurch dass wir jetzt immer wieder die Differenz zwischen den Zeiten berechnen und nicht mehr hochzählen, können wir auch das Intervall für die Neuberechnung beliebig verändern. Für den Anfang haben wir uns für 500ms entschieden.

Ein kleiner etwas technischer Bonus, welchen wir uns überlegt haben, gibt es dabei auch noch. Zwischen dem Empfang der ersten Daten vom Server und dem Aufbau des Javascripts liegen auch nochmals mehrere hundert Millisekunden im Zweifel. Diese Zeit wird versucht zu ermitteln und fließt dann mit in die Berechnung ein.

Fazit

Die beschriebene Lösung mag sich vielleicht nicht sonderlich komplex anhören, es war allerdings ein ganzes Stück Arbeit, das entsprechende System dafür aufzubauen. Die Tests sahen bis jetzt immer sehr vielversprechend aus und es gab keinerlei Probleme. Man muss dazu aber auch sagen, mit dem alten System hatte ich erst nach einigen Minuten minimale Abweichungen.

Ich freue mich, wenn wir es auf die Probe stellen können.