M15 / v6 production
29.8 FPS
Pixel diff, semantic dirty regions, clipped render and dual canvases hold idle at 29.6–29.8 FPS.
Optimization follows one rule: establish a completely correct full reference, then remove only work proven unchanged. Multi-frame pixel tests prove each step preserves output.
M15 / v6 production
Pixel diff, semantic dirty regions, clipped render and dual canvases hold idle at 29.6–29.8 FPS.
logic + render + compare/diff + present/flush + scheduler overheadSubmitting fewer pixels is insufficient if every frame still scans all 217,156 pixels. Semantic comparisons are insufficient if scene drawing itself costs 21.6 ms. Rendering, comparison and submission must all shrink.
Compare the two canvases and submit only changes. Present falls to about 6.9 ms, but full scanning/rendering still caps around 26.8 FPS.
Known objects mark core, Makers, orbits, numbers and bottom controls directly. Purchases, settings and page changes still request a full frame.
Push clipping into framebuffer drawing and redraw only moving rectangles. Static type updates by state fingerprint or lower frequency while the dynamic center follows presentation rate.
Effects, particles, callouts and tilted objects use old/new unions. Eight scenes × 30 frames of incremental output match the full reference pixel by pixel.
Makers only have 6/8 FPS source frames and static text changes even less often. The main loop still responds to input and particles at 30 FPS while wide regions update at their real authored cadence.
A 33 ms LVGL request plus cooperative overhead undershoots 30 FPS; v7 uses 32 ms, restoring ordinary QA to 29.2–29.3 FPS. Reduced uses about 67 ms and ambient 500 ms.
The current complex save has more unlocked objects plus continuous 33 ms IMU and 50 ms PWR tasks, measuring 26.2–26.7 FPS. This is recorded instead of hidden behind a 30 FPS target; the next pass should begin from measured render ≈23 ms and present ≈7 ms.