Menü-Demo läuft mit variabler Zeitschrittweite und damit mit anderer Physik als das Spiel #10

Open
opened 2026-08-29 01:41:10 +02:00 by G1LL1 · 2 comments
G1LL1 commented 2026-08-29 01:41:10 +02:00 (Migrated from gitlab.g1ll1.com)

Komponente: GAME (updateDemo, simStepDemo)
Betroffene Version: main @ 238ed66, index.html Zeilen 2731–2754

Beschreibung

Der laufende Hintergrund des Hauptmenüs ist ein echter Autopilot-Lauf – er verwendet aber die
Bildschirm-Framerate als Simulationsschritt, während das Spiel selbst mit
FIXED_TIMESTEP = 1/120 in einer Akkumulatorschleife rechnet:

// index.html:2731-2747  updateDemo(dt)
CORE.generateAhead(d.world, d.gen, {...}, d.camX + LW * 1.8);
CORE.pruneWorld(d.world, d.camX - LW);
...
simStepDemo(dt);              // dt = Framezeit * 0.85 (bzw. * 0.6 bei reduced)
d.t += dt;

// index.html:2749-2754  simStepDemo(dt)
const cmd = CORE.autopilot(d.body, d.world, { speed: speed }, d.strat, d.t, d);
CORE.stepBody(d.body, d.world, dt, cmd, speed, d.t, {});

Der Spielerpfad dagegen (update, Zeile 2652–2657):

S.acc += dt * S.timeScale;
while (S.acc >= K.FIXED_TIMESTEP && steps < 8) { simStep(K.FIXED_TIMESTEP); ... }

Auswirkung

  • Die Demo-Physik ist bildratenabhängig: Pendelbewegung, Sprunghöhe und Landezeit unterscheiden
    sich zwischen 60 Hz, 120 Hz und reducedMotion (dt * 0.6).
  • Die Menü-Demo ist damit kein valider Referenzlauf: Was dort an Schwüngen und Sprüngen zu
    sehen ist, muss im Spiel anders aussehen – und umgekehrt deckt die Demo Regressionen im
    Fixzeitschritt nicht auf.
  • Bei langen Bildschreibzeiten (> MAX_FRAME_TIME = 33 ms, z. B. Backend-Tabs) wird die Demo
    zusätzlich verzögert, aber nicht schrittstabil gerechnet.

Lösungsvorschlag

Wie im Spiel akkumulieren:

d.acc = (d.acc || 0) + dt;
let steps = 0;
while (d.acc >= K.FIXED_TIMESTEP && steps < 6) {
  const cmd = CORE.autopilot(d.body, d.world, { speed }, d.strat, d.t, d);
  CORE.stepBody(d.body, d.world, K.FIXED_TIMESTEP, cmd, speed, d.t, {});
  d.t += K.FIXED_TIMESTEP; d.acc -= K.FIXED_TIMESTEP; steps++;
}

Dokumentiert in gitlab-issues/10-menue-demo-variable-zeitschrittweite.md (Commit 238ed66). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.

**Komponente:** GAME (`updateDemo`, `simStepDemo`) **Betroffene Version:** `main` @ `238ed66`, `index.html` Zeilen 2731–2754 ## Beschreibung Der laufende Hintergrund des Hauptmenüs ist ein echter Autopilot-Lauf – er verwendet aber die Bildschirm-Framerate als Simulationsschritt, während das Spiel selbst mit `FIXED_TIMESTEP = 1/120` in einer Akkumulatorschleife rechnet: ```js // index.html:2731-2747 updateDemo(dt) CORE.generateAhead(d.world, d.gen, {...}, d.camX + LW * 1.8); CORE.pruneWorld(d.world, d.camX - LW); ... simStepDemo(dt); // dt = Framezeit * 0.85 (bzw. * 0.6 bei reduced) d.t += dt; // index.html:2749-2754 simStepDemo(dt) const cmd = CORE.autopilot(d.body, d.world, { speed: speed }, d.strat, d.t, d); CORE.stepBody(d.body, d.world, dt, cmd, speed, d.t, {}); ``` Der Spielerpfad dagegen (`update`, Zeile 2652–2657): ```js S.acc += dt * S.timeScale; while (S.acc >= K.FIXED_TIMESTEP && steps < 8) { simStep(K.FIXED_TIMESTEP); ... } ``` ## Auswirkung * Die Demo-Physik ist bildratenabhängig: Pendelbewegung, Sprunghöhe und Landezeit unterscheiden sich zwischen 60 Hz, 120 Hz und `reducedMotion` (`dt * 0.6`). * Die Menü-Demo ist damit **kein** valider Referenzlauf: Was dort an Schwüngen und Sprüngen zu sehen ist, muss im Spiel anders aussehen – und umgekehrt deckt die Demo Regressionen im Fixzeitschritt nicht auf. * Bei langen Bildschreibzeiten (> `MAX_FRAME_TIME` = 33 ms, z. B. Backend-Tabs) wird die Demo zusätzlich verzögert, aber nicht schrittstabil gerechnet. ## Lösungsvorschlag Wie im Spiel akkumulieren: ```js d.acc = (d.acc || 0) + dt; let steps = 0; while (d.acc >= K.FIXED_TIMESTEP && steps < 6) { const cmd = CORE.autopilot(d.body, d.world, { speed }, d.strat, d.t, d); CORE.stepBody(d.body, d.world, K.FIXED_TIMESTEP, cmd, speed, d.t, {}); d.t += K.FIXED_TIMESTEP; d.acc -= K.FIXED_TIMESTEP; steps++; } ``` --- *Dokumentiert in `gitlab-issues/10-menue-demo-variable-zeitschrittweite.md` (Commit `238ed66`). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.*
G1LL1 commented 2026-08-29 01:45:28 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
G1LL1 commented 2026-08-29 01:48:12 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
Sign in to join this conversation.
No description provided.