Das Zeitbudget
Ein Spiel ist eine Endlosschleife, die in jedem Durchlauf ein neues Bild berechnet. Die Zeit für einen Durchlauf ist knapp, und daraus folgt fast alles in diesem Buch.
Die Spielschleife
letzte = zeit()
while spiel_laeuft:
jetzt = zeit()
dt = jetzt - letzte # vergangene Zeit in Sekunden
letzte = jetzt
eingaben_lesen()
welt_aktualisieren(dt) # Bewegung, Kollisionen
bild_zeichnen()
Bei 60 Bildern pro Sekunde dauert ein Durchlauf höchstens 1 s ÷ 60 ≈ 16,7 ms. Schafft das Programm das nicht, ruckelt das Spiel.
Warum dt?
Nicht jeder Rechner schafft gleich viele Bilder. Würde eine Figur pro Bild um einen festen Betrag weiterrücken, wäre sie auf einem schnellen Rechner schneller. Deshalb rechnet man mit der vergangenen Zeit:
x = x + geschwindigkeit * dt # Weg = Geschwindigkeit · Zeit
Stelle „fester Schritt pro Bild“ ein und verändere die Bildrate: Das Quadrat wird schneller und langsamer. Mit dt bleibt die Geschwindigkeit gleich, nur die Bewegung wird bei niedriger Bildrate ruckeliger.
Wie viel Rechnung passt in ein Bild?
Ein Bildschirm mit 1920 × 1080 Pixeln hat rund 2,07 Millionen Pixel. Bei 60 Bildern pro Sekunde sind das etwa 124 Millionen Pixel pro Sekunde. Ein Prozessorkern schafft grob eine Milliarde einfache Rechenschritte pro Sekunde. Pro Pixel blieben also nur etwa 8 Rechenschritte, und die Spiellogik ist darin noch nicht enthalten.
Daraus folgen zwei Konsequenzen, die sich durch alle Kapitel ziehen:
- Der Aufwand zählt. Ein Verfahren, dessen Aufwand quadratisch mit der Zahl der Objekte wächst, ist schnell unbrauchbar.
- Parallel rechnen. Die Grafikkarte besitzt Tausende einfacher Recheneinheiten. Geeignet sind Verfahren, bei denen jedes Dreieck und jedes Pixel unabhängig von den anderen berechnet werden kann.
- etwa 6,9 ms
- etwa 14,4 ms
- etwa 69 ms
Aufgabe: Eine Figur läuft mit 4 m/s. Das Spiel schafft 50 Bilder pro Sekunde. Um wie viel ändert sich ihre Position pro Bild? Was ändert sich bei 25 Bildern pro Sekunde?
Lösung anzeigen
dt = 1 ÷ 50 = 0,02 s, also 4 · 0,02 = 0,08 m pro Bild. Bei 25 Bildern ist dt = 0,04 s und der Schritt 0,16 m. Pro Sekunde bleiben es in beiden Fällen 4 m.