EMZETT.
Login

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