Add a small top-left FPS readout for gauging frame cost while tuning the organic animations. Gated behind the M3TE_FPS startup env pin (read like the other M3TE_* hooks); unset/=0 renders nothing, so default play and every committed golden stay byte-identical. - main.sx: g_fps_on (from M3TE_FPS) + g_fps_avg_dt, an EMA of delta_time (FPS_DT_SMOOTH=0.9) advanced only on the gated path; build_ui passes the smoothed FPS + flag into BoardView. delta_time is real wall-clock even when M3TE_ANIM_TIME pins the scene, so the counter stays live while frozen. - board_view.sx: BoardView.fps_on/fps fields + render_fps_overlay — "FPS n" in the top-left safe-area corner (clear of notch/Dynamic Island + the HUD), dark grape text over a bright halo. Drawn last, only when fps_on. - README.md: document M3TE_FPS (sim SIMCTL_CHILD_ + device devicectl env). - goldens/p20_fps.png: FPS overlay over the resting board (M3TE_FPS=1, M3TE_ANIM_TIME=0); FPS digits are dynamic, rest pinned == p6_idle_t0 region. Verified: ios-sim build + 22 logic tests green. Unset capture's board+HUD region is byte-identical to goldens/p6_idle_t0.png; the only ON-vs-OFF delta is the top-left FPS text box.
3.2 MiB
1206x2622px
3.2 MiB
1206x2622px