Zum Inhalt springen
Michael Malura
570 Github Stars 5810 npm Downloads 53 Projekte

Update Loop

Die einfachste Spielschleife passt in drei Zeilen: Eingabe lesen, Spiel aktualisieren, Bild zeichnen, wieder von vorn. Sie läuft so schnell, wie der Rechner kann. Das ist genau das Problem, denn dann hängt alles an der Geschwindigkeit der Maschine.

Das türkise Quadrat bewegt sich in festen 60 Updates pro Sekunde, egal wie oft gezeichnet wird. Unten links in der Demo siehst du beide Zähler: updates/s bleibt bei 60, frames/s folgt deinem Bildschirm.

Logik und Zeichnen trennen

Die Schleife in der Demo misst, wie viel Zeit seit dem letzten Durchlauf vergangen ist, und legt sie in einen Topf, den Accumulator. Solange darin mindestens ein Schritt von 1/60 Sekunde liegt, läuft ein Logik-Update und der Topf wird um einen Schritt kleiner. Gezeichnet wird danach einmal:

frameTime = std::min(frameTime, 0.25);
accumulator += frameTime;
while (accumulator >= kStep) {
    update();
    accumulator -= kStep;
}
draw();

Die Klemme auf 0,25 Sekunden hat einen Grund. Hängt das Spiel einen Moment, würde der Topf hunderte Schritte auf einmal nachholen, das Nachholen dauert selbst zu lange, und die Schleife kommt nie wieder hinterher. Sie klemmt das Frame-Intervall, bevor es so weit kommt. Wie das Zeichnen zwischen zwei Logik-Schritten aussieht, zeige ich im Post Fester Zeitschritt. Der Gegenentwurf, bei dem die Schrittweite mit der Frame-Zeit wächst, steht in Delta Time.

Dasselbe in Python

Die zweite Demo ist die gleiche Schleife in Python mit pygame-ce, die direkt im Browser über Pyodide läuft. Beim ersten Start lädt sie rund 15 MB Laufzeit nach, danach ist sie im Cache. Dumm nur: In meiner ersten Version lief die Schleife mit über 2000 Frames pro Sekunde, weil await asyncio.sleep(0) dem Browser keine Pause gibt. Jetzt schläft sie pro Durchlauf kurz (await asyncio.sleep(1 / 120)), die Logik bleibt trotzdem bei 60 Updates.

Die Schrittlogik steckt in einer kleinen Klasse FixedStepper, die ich mit sechs Unit-Tests abgesichert habe. Sie kennt weder pygame noch Pyodide und läuft deshalb auch nativ im Test.

Beide Demos liegen im Repo: C++ mit SDL3 und Python mit pygame-ce. Alle Demos der Serie sammelt das Projekt Game Dev Snippets.

24.07.2026 aktualisiert 06.11.2026
Teilen X Reddit Hacker News LinkedIn E-Mail
Neue Beiträge abonnieren RSS JSON