Java Advanced
Game Loop mit fester Taktung (FPS/UPS) & Delta-Time
Eine while(true)-Schleife ohne Bremse läuft auf jedem Rechner unterschiedlich schnell. Um eine konstante Spielgeschwindigkeit zu garantieren, wird die verstrichene Zeit gemessen (System.nanoTime()) und in festen Zeitschritten abgearbeitet. Kernkonzepte: Fixed Timestep: Die Logik updatet in festen Abständen (z. B. 60 Updates/s). Multi-Threading: Der Loop läuft in einem eigenen Thread (Runnable), um die Benutzeroberfläche nicht zu blockieren. Threading-Safety: UI-Neuzeichnungen werden nicht direkt aus dem Loop aufgerufen, sondern über repaint() an den Event Dispatch Thread (EDT) übergeben.
Referenz:
Datei
1. Spielprojekt
· Klasse GameLoop
// Entnommen aus GameLoop.java
@Override
public void run() {
long lastTime = System.nanoTime();
double accumulatedTime = 0;
while (running) {
long now = System.nanoTime();
double elapsed = now - lastTime;
lastTime = now;
accumulatedTime += elapsed;
while (accumulatedTime >= NS_PER_UPDATE) {
update(NS_PER_UPDATE / 1_000_000_000.0); // Delta-Time in Sekunden
accumulatedTime -= NS_PER_UPDATE;
}
gamePanel.repaint(); // Abgabe an EDT
sleepBriefly();
}
}