Hält das Spiel die Spielzeit in einem ungenauen Gleitkommaformat (float), sinkt die Zeitauflösung (kleinster unterscheidbarer Zeitabstand), je länger es läuft. Bewegungen und Effekte zittern.
Warum Seit Spielstart vergangene Zeit wird als float aufsummiert oder direkt an Shader übergeben → Folge Je länger das Spiel läuft, desto größer wird der kleinste Abstand, den float darstellen kann → Auf dem Bildschirm Nur bei Clients, die seit Tagen laufen, zittern Charaktere, Animationen und fließende Effekte, nach einem Neustart ist alles normal
Verstrichene Zeit als double (64 Bit) oder Ganzzahl speichern, an Shader übergebene Zeit in festen Abständen zurücksetzen, automatisierte Langzeittests über mehrere Tage.
Größenordnungen
Ein 32-Bit-float hat gut 7 signifikante Stellen. Nach einem Tag Laufzeit (etwa 86.400 s) liegt die Zeitauflösung bei etwa 8 ms, also etwa einem halben Frame bei 60 FPS (16,7 ms), nach einer Woche bei etwa 60 ms und damit über einem ganzen Frame.
Im Graphen
Langsamer Anstieg · Zitter-Meldungen nach Laufzeit des Clients
Wo nachsehen
Bei Zitter-Meldungen die Laufzeit des Clients mit abfragen und vor und nach einem Neustart vergleichen. Entwicklungsseitig testen, indem der Startzeitwert des Spiels auf einen Wert mehrere Tage in der Vergangenheit gesetzt wird
Spricht dafür
Zittern nur bei Clients, die seit Tagen laufen, verschwindet nach einem Neustart und wird mit längerer Laufzeit stärker
Spricht dagegen
Zittern direkt nach dem Start: „Fehlender oder zu kurzer Interpolationspuffer“ oder „Timer-Auflösung“
Prüfmittel
Prüfung in der Umgebung des Spielers
Mehr dazu
Besonders häufig bei Mobile-MMOs, in denen Spieler Auto-Farming tagelang laufen lassen. Auch Time.time in Unity ist ein float, deshalb bietet Unity zusätzlich Time.timeAsDouble als double an und empfiehlt diese Variante.
Quellen
Time.timeAsDoubleUnity double-Variante von Time.time, bei langer Laufzeit genauer als float, wird für die meisten Fälle empfohlen