Skip to content

Frame-Rate Optimization

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.

30 FPS TARGET

M15 / v6 production

29.8 FPS

Pixel diff, semantic dirty regions, clipped render and dual canvases hold idle at 29.6–29.8 FPS.

Split the bottleneck

text
logic + render + compare/diff + present/flush + scheduler overhead

Submitting 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.

Stages

1. Pixel diff

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.

2. Semantic dirty regions

Known objects mark core, Makers, orbits, numbers and bottom controls directly. Purchases, settings and page changes still request a full frame.

3. Clipped render

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.

4. Swept bounds

Effects, particles, callouts and tilted objects use old/new unions. Eight scenes × 30 frames of incremental output match the full reference pixel by pixel.

5. Authored-phase frequency split

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.

6. Scheduler calibration

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.

Current boundary

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.

Rejected shortcuts

  • Do not reduce logic time precision.
  • Do not upscale a lower-resolution frame.
  • Do not replace authored pixels with interpolation or blur.
  • Do not remove critical FX, TEAM or tilt feedback.
  • Do not call trails or missed full refreshes “visually acceptable.”