Game Loop und Deltazeit: Wie Spiele laufen
Kurz: Ein Spiel läuft in einer Endlosschleife aus Eingaben lesen, Zustand aktualisieren und Bild zeichnen; die Deltazeit sorgt dafür, dass es auf schnellen und langsamen Geräten gleich schnell abläuft.
Genauer: Anders als eine Anwendung, die auf Klicks wartet, muss ein Spiel ständig weiterlaufen, auch wenn der Spieler nichts tut. Das Herzstück ist die Game Loop (Spielschleife).
Im Detail
Die drei Schritte
solange Spiel läuft:
eingabe = lese_eingaben() # Tasten, Maus, Controller
aktualisiere(spielzustand, dt) # Bewegung, Physik, KI, Regeln
zeichne(spielzustand) # Bild auf den Bildschirm
Ein Durchlauf ist ein Frame. 60 Durchläufe pro Sekunde ergeben 60 FPS (Bilder pro Sekunde), das heißt rund 16,7 Millisekunden je Frame.
Deltazeit
Ohne Zeitmessung läuft ein Spiel auf einem schnellen Rechner schneller. Die Lösung: Man misst die Zeit seit dem letzten Frame (dt) und rechnet damit:
let letzte = performance.now();
function schleife(jetzt) {
const dt = (jetzt - letzte) / 1000; // Sekunden
letzte = jetzt;
figur.x += geschwindigkeit * dt; // Pixel pro Sekunde
zeichnen();
requestAnimationFrame(schleife);
}
requestAnimationFrame(schleife);requestAnimationFrame ruft die Funktion passend zur Bildwiederholrate des Monitors auf und pausiert in inaktiven Tabs.
Feste Zeitschritte
Physik und Kollision werden mit variablem dt instabil (Objekte „tunneln“ durch Wände, Sprünge sind unterschiedlich hoch). Besser: ein fester Zeitschritt (zum Beispiel 1/60 s) für die Logik, Zeichnen läuft separat. Sammle verstrichene Zeit in einem Akkumulator und führe so viele feste Schritte aus, wie hineinpassen. Wichtig ist, dt bei langen Pausen zu begrenzen (zum Beispiel höchstens 0,25 s).
Weitere Hinweise
Trenne Logik und Darstellung, begrenze Speicherzuweisungen im Loop (Garbage Collection kann Ruckeln verursachen), nutze Objekt-Pools statt ständig neue Objekte anzulegen, und messe mit einem FPS-Zähler und Profiler. Eingaben zuerst sammeln, dann in der Logik auswerten.
Siehe auch: Game Engine, Browserspiele programmieren, FPS, Latenz