Skip to content

feat(examples): stress-tv autosweep measures load time, not steady-state FPS#85

Merged
chiefcll merged 1 commit into
mainfrom
feat/stress-tv-loadtime-sweep
Jun 9, 2026
Merged

feat(examples): stress-tv autosweep measures load time, not steady-state FPS#85
chiefcll merged 1 commit into
mainfrom
feat/stress-tv-loadtime-sweep

Conversation

@chiefcll

@chiefcll chiefcll commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Why

On a 60 Hz TV, the steady-state FPS of a static grid just pins at the panel refresh — so the old autosweep reported every tier as "limited by index cap" at ~60 fps. The FPS number revealed nothing, because the renderer keeps up frame-to-frame right until the correctness cap. The cost that actually hurts a constrained device is the one-time build + texture upload (the slow load, eventual OOM), which the FPS sweep deliberately skipped during its warm-up.

What changed

  • The sweep now measures time-to-ready (buildGridrenderer idle) per count and reports the highest count that loads within a budget:
    ?test=stress-tv&autosweep=true                (default 1000ms)
    ?test=stress-tv&autosweep=true&loadbudget=500
    
  • FPS kept as a secondary readout (labelled, not the deciding metric).
  • Stops probing past the ladder max. The old code appended the index cap (up to 16384) as an extra test rung — fine for cheap FPS sampling, but building 16384 nodes for a load-time measurement would hang/OOM the very device we're profiling.
  • Per-tier limiter is now meaningful: ladder max / >Nms load / index cap, instead of always index cap.

Verified

In-browser (tight loadbudget=80 to force a crossover on a fast 120 Hz dev box):

SWEET SPOT - loads in <80ms   (VAO ON)
tier 1: 2000 cards  (42ms load, 120 fps, ladder max)
tier 2: 1775 cards  (77ms load, 120 fps, >80ms load)   ← bisected
tier 3: 1200 cards  (72ms load, 120 fps, >80ms load)
tier 4:  800 cards  (50ms load, 120 fps, index cap)

Each tier now reports a distinct, meaningful limit. Default scene (200 cards, +image) is unchanged, so the certified chromium-ci snapshot is unaffected.

🤖 Generated with Claude Code

…y-state FPS

On a vsync-capped TV the steady-state FPS of a static grid just pins at the
panel refresh, so the old sweep reported every tier as "limited by index cap"
at ~60fps — the FPS number carried no signal. The cost that actually hurts on
a constrained device is the one-time build + texture upload (the slow load,
and eventual OOM), which the FPS sweep skipped during its warm-up.

The sweep now measures time-to-ready (buildGrid -> renderer idle) per count and
reports the highest count that loads within a budget:

  ?test=stress-tv&autosweep=true                (default 1000ms)
  ?test=stress-tv&autosweep=true&loadbudget=500

FPS is kept as a secondary readout. Also stops testing past the ladder max:
the old code appended the index cap (up to 16384) as a probe rung, which is
fine for cheap FPS sampling but would hang/OOM the device when building that
many nodes for a load-time measurement.

Per-tier limiter is now meaningful (ladder max / load budget / index cap)
instead of always "index cap". Verified in-browser; default scene unchanged so
the certified snapshot is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@chiefcll chiefcll merged commit 8dbf5ae into main Jun 9, 2026
1 check passed
@chiefcll chiefcll deleted the feat/stress-tv-loadtime-sweep branch June 9, 2026 11:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant