Sammeln Sie die verstrichene Zeit und führen Sie begrenzte Aktualisierungen durch
Fügen Sie bei jedem Animationsrückruf die verstrichene Zeit zu einem Akkumulator hinzu. Während der Akkumulator mindestens einen Schritt enthält, aktualisieren Sie die Physik um ein konstantes Intervall, z. B. 1/60 Sekunde, und subtrahieren Sie dieses Intervall. Rendern Sie dann den neuesten Stand. Legen Sie eine maximale Anzahl von Aufholschritten pro Frame fest. Andernfalls kann eine lange Pause zu einem großen Rückstand führen, der mehr Zeit in Anspruch nimmt und die Verzögerung verschlimmert. Entscheiden Sie explizit, ob überschüssige Zeit gelöscht, begrenzt oder durch eine andere Wiederherstellungsregel behandelt wird.
Halten Sie die Einheiten konsistent. Wenn die Geschwindigkeit in Welteinheiten pro Sekunde gemessen wird, multiplizieren Sie sie mit dem festen Schritt in jeder Simulationsaktualisierung. Multiplizieren Sie nicht dieselbe Geschwindigkeit mit der gesamten verstrichenen Zeit des Frames und führen Sie auch mehrere feste Aktualisierungen durch, da sonst die Bewegung doppelt gezählt wird.
Behandeln Sie Eingabe und Rendering innerhalb Ihrer eigenen Grenzen
Erfassen Sie den gehaltenen Eingabezustand für jeden Simulationsschritt oder stellen Sie einmalige Aktionen in die Warteschlange, bis sie von einem Schritt verbraucht werden. Wenn zwischen zwei Frames ein Tastendruck erfolgt, stellen Sie sicher, dass dieser vor dem nächsten Update nicht verloren geht. Beim Rendern kann zwischen physikalischen Zuständen interpoliert werden, während Kollision und Bewertung den Simulationszustand verwenden. MDN beschreibt requestAnimationFrame als einen einmaligen Rückruf, der vor dem Repaint geplant wird, und empfiehlt, seinen Zeitstempel zur Berechnung des Fortschritts zu verwenden; Ein Akkumulator verwendet diesen Zeitstempel, um Aktualisierungen in festen Intervallen auszuführen.
Testen Sie die Grenzen der Schleife
Vergleichen Sie dieselbe kurze Bewegung und Kollision über normale Frames, einen simulierten langsamen Frame und eine längere Pause. Stellen Sie sicher, dass ein Spieler nicht durch eine dünne Wand tunnelt, nach einem längeren Frame-Stall mehr Geschwindigkeit gewinnt oder beim Aufholen mehrmals eine Kollision auslöst. Testen Sie Pause und Hidden-Tab-Return entsprechend Ihrer beabsichtigten Regel. Wenn die Simulation mit der Schleife mit festem Schritt stabil ist, eine Kollision aber bei hoher Geschwindigkeit dennoch fehlschlägt, verwenden Sie eine für die Bewegung geeignete Kollisionsmethode, anstatt die Renderfrequenz zu erhöhen.
Fragen zu Feste Zeitschritt-Spielphysik
Garantiert ein fester Zeitschritt eine deterministische Physik?
Nein. Dadurch wird das Simulationsintervall konsistent, aber Eingabezeitpunkt, Mathematik und Kollisionsreihenfolge können dennoch zu Abweichungen führen. Steuern Sie diese separat für Tests, die wiederholt werden müssen.
Warum sollten Nachholaktualisierungen nach einem Frame-Stall begrenzt werden?
Ohne eine Grenze kann das Aufholen spätere Frames monopolisieren und die Verzögerung verschlimmern. Wählen und testen Sie eine Wiederherstellungsrichtlinie, die zum Spiel passt, einschließlich der Frage, ob simulierte Zeit verworfen werden darf.
Weiterlesen
Etwas nicht mehr aktuell? Korrektur melden