feat(timing): opt-in whole-game high frame rate scheduler

Merged
NO
10d ago
+8400-30

Stacked on #131, which adds the pause and frame-step hotkeys this layer uses. Review and merge after it.

Summary

An opt-in hand-written scheduler that runs the game's logic at its authored 60 Hz tick and presents interpolated frames between ticks. This is the whole-game alternative to split-rate presentation (#98).

RECOMP_GAME_HZ=120   (60..360; unset = original timing)
  game_scheduler   owns scene and frame-production fibers, input edges, elapsed time
  per authored tick: menus, match logic, sound service, effects
  per display pass:  interpolate completed ticks (actors, camera, foliage sway), snap across camera cuts
  presenter          paces frames at the game rate, drops display passes that cannot fit
  • Research and milestones: docs/wayfinder/research/high-frame-rate-whole-game.md, now in the public export.
  • Always on: the draw adapter no longer runs the generated indexed-draw body (6842a72), and the presenter paces at the game rate.

Verification

  • MSVC Debug build and ctest at this layer: 39/39 passed.
  • python tools/public_export.py verify --require-public-tree passes.
  • clang, macOS and Linux: covered by this PR's public-ci run.
  • Player play tests: correct at 60 Hz. At 120 Hz characters and the ball show slight streaking. At 240 Hz animation timing and camera placement break. Split-rate remains the release path; this layer is research behind a flag.
  • Agent runs: 60 Hz and 120 Hz matched at all 8,648 shared ticks and on every shared RNG event (see the research doc).

Merge danger

Two-way door, but large (about 8,400 lines, 27 commits, including a wip checkpoint). With RECOMP_GAME_HZ unset the scheduler stays off. The indexed-draw change is always on and touches every indexed draw.

Contribution checklist

  • The change follows AGENTS.md and CONTRIBUTING.md.
  • No XBE, generated game C, retail instruction bytes, extracted assets or
    filenames, saves, BIOS data, private paths, or run evidence are included.
  • Third-party material and its license are identified, if applicable.