mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-10 09:06:36 +00:00
refactor(bench): grade render_bench with the shared frame-timing recorder
render_bench.py (from the parallel perf/render-bench work) had its own grading module, frame_pacing, with its own definition of a missed frame and its own refresh estimate. The soak already had both in frame_timing, so the two could have drifted apart on what "late" means. The bench now gives the display manager a fresh FrameTimingRecorder, drains it synchronously at the start and end of the graded run, and prints frame_soak's report with frame_soak's verdict. Its workload is unchanged: the synthetic strip, --busy load, the shared speed resolver, the per-frame scrolling announcement. frame_pacing, its tests and its src.common exports are removed; measure_refresh_hz moves to frame_timing, where scroll_speeds.py now finds it. Two ideas from frame_pacing carry over. The bench seeds the recorder with the idle refresh it measures, so a loop that free-runs (the 827fps bug the first bench caught) shows as early frames and one stuck at half rate as late frames, where an estimate taken from their own intervals finds both self-consistent. And the soak, which has no idle measurement, now calls a run NOT LOCKED when its refresh estimate beats the configured cap. The report also gives the rate held while rendering. Docs: the bench becomes "Without the service" under "Soaking a rig", keeping its hdpi numbers and the idle-vs-rendering refresh finding. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+8
-10
@@ -19,16 +19,14 @@ accepts both, but the store flags the old spelling as deprecated
|
||||
|
||||
## Unreleased
|
||||
|
||||
- `src.common.frame_pacing` — grades a run of presented frames against the
|
||||
panel's real refresh rate: how many slipped a whole refresh, and whether the
|
||||
loop was locked to the panel at all. `scripts/render_bench.py` drives a real
|
||||
`DisplayManager`/`ScrollHelper` scroll through it and exits non-zero when a
|
||||
rig misses more than 0.1% of frames, so a rig can be measured before a
|
||||
release rather than eyeballed. The panel's refresh is read back out of the
|
||||
frames rather than taken from the idle measurement: a Pi 4 driving 512x64
|
||||
holds 100.4Hz idle and 96.3Hz while rendering, and grading against the idle
|
||||
figure reports misses a perfectly locked loop never had. See
|
||||
`docs/SCROLL_PERFORMANCE.md`, "Measuring a rig".
|
||||
- `src.common.frame_timing` -- times every frame the display presents, whoever
|
||||
drew it, and writes cumulative counters to `/dev/shm`. Two tools read it:
|
||||
`scripts/frame_soak.py` judges a running service (late frames, freezes,
|
||||
where the time goes), and `scripts/render_bench.py` judges the hardware and
|
||||
render path alone on a synthetic strip. Both fail a run above 0.1% late
|
||||
frames, and both call a loop that never waited for the panel NOT LOCKED. A
|
||||
stall watchdog logs the stack of whatever holds a scroll up for 250 ms or
|
||||
more. See `docs/SCROLL_PERFORMANCE.md`, "Soaking a rig".
|
||||
|
||||
- `FontManager.get_font()` returns a BDF font at its native size when asked for
|
||||
a size the file doesn't contain (5x7.bdf at 8 or 10px, say). It used to
|
||||
|
||||
Reference in New Issue
Block a user