Menü-Demo: die Neuplanung rechnet gegen ein NaN-Ziel – keine einzige Muster-Strategie wird je geprüft #17
Labels
No labels
accessibility
bug
cleanup
consistency
crash
critical
game-feel
gameplay
high
input
level-generation
low
maintainability
medium
pause
physics
responsive
security
spec-gap
ui
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gilli/pulse-sprint#17
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Menü-Demo: die Neuplanung rechnet gegen ein NaN-Ziel – keine einzige Muster-Strategie wird je geprüft #17"
By gilli — Closed
bug
consistency
game-feel
medium
2 comments
Behoben in
31c648d(Doku-Nachtrag4a86d21), beide Punkte des Lösungsvorschlags plus Zähler.Geändert
startDemo/updateDemoübergebenx1mit:plans.push({ x0: placed.x0, x1: placed.x1, strategy: placed.strategy })—placedträgtdas Feld seit
buildPattern, es wurde nur weggeworfen.liveStrategyakzeptiert kein nicht-endlichesx1als Ziel:const untilX = (plan && isFinite(plan.x1) ? plan.x1 : body.x + 1400) + 80;— ein künftigerAufrufer ohne
x1rechnet damit wieder ins Leere, aber nicht mehr 26 500 Schritte lang undnicht mehr stumm. Kommentar an
simProbehält die Regel fest (b.x >= NaNwird nie wahr).liveStrategy(…, stats)zählt auf WunschuntilX,probed,fallback(optionaler Ausgabeparameter, analoggen.stats). Das Produkt ruft ohnestatsauf, im Frame entsteht kein Zusatzaufwand.Gemessen (Demo-Nachbau wie
startDemo/updateDemo, fester SchrittK.FIXED_TIMESTEP,6 Samen × 45 s)
liveStrategyselbst hat nie eine bestätigtDer Rückfall auf die Muster-Strategie war also nicht nur teuer: an 54 Grenzen wäre er real
in den Tod gegangen — die zwei Neustarts im Nachbau sind die Stellen, an denen die Demo
tatsächlich gestorben ist. Damit ist der Schutz aus #15 („Demo kommt fliegend an“) erstmals wirksam.
Test: neue Suite
tests/issue17.mjs(17 Prüfungen, intests/run-all.shaufgenommen)plans.push-Stellen des Dokuments — die Schlüssel werden aus demObjekt-Literal gelesen und der Demo-Nachbau baut seine Pläne damit, sonst maße er eine
Fassung, die es nicht gibt. Dazu
isFinite-Anker anuntilX.stats.probed/fallback/untilX, ein Plan ohnex1liefert endliches Zielund kurze Probenliste, die zurückgegebene Strategie überlebt genau dieses Ziel.
Wechsel, bestätigte Proben ≥ 90 %, dazu unverändert 0 Neustarts, Seilkontakt und Strecke.
Gegen
main(PULSE_HTML=git show HEAD:index.html) wären 11 dieser Prüfungen rot, jetzt grün.tests/issue15.mjsund die übrigen Node-Suiten bleiben grün;run-all.shkomplett gelaufen —einzig
browser_flow.pyzeigte die dokumentierte Bildraten-Unschärfe (28,4 px gegen 28,3 pxSchranke bei dt 27,7 ms), wechselnd gegen alte und neue Fassung gemessen; verbindlich dafür ist
tests/issue2.mjs.Kleine Richtigstellung zu meiner Tabelle oben (Nachtrag
259a65b): die Zeile „bestätigteProben 0“ in der Commit-Botschaft zu
31c648dstammte aus einem Lauf, in dem dieBestätigungsprüfung selbst kaputt war –
simProbe(world, body, ctx, s, t0, untilX, dt, margin)war mit vertauschten Argumenten aufgerufen (dt an Stelle von untilX), bestätigte also eine
einzige Schrittlänge statt des Musterendes.
Richtig gemessen liefert die Auslieferung 196 von 250 Grenzen (78 %) eine Strategie, die
gegen
x1 + 80überlebt – nur hatliveStrategyselbst nie eine davon bestätigt, weil seineeigene Probe gegen NaN lief. Die Aufwandszahlen bleiben wie angegeben: 48 Proben auf jeder
Grenze, Ø 3,2 ms / p95 4,8 ms / Spitze 5,6 ms, 2 Neustarts (nach dem Fix 0).
Zusätzlich im Suite-Kopf vermerkt:
PULSE_HTMLverschiebt intests/issue17.mjsnur dieStruktur-Anker – die Simulation kommt über
harness.mjsimmer aus demindex.htmldesArbeitsbaums. Für den Rot-Nachlauf gegen eine alte Fassung ist die also als
index.htmleinzusetzen (dann: 11 von 17 Prüfungen rot).