Entry / Exit
Decision
Fixed Update (game logic)
Render Submission
OS Frame Begins
runFrame() called
Measure Elapsed Time
elapsedTime = gameClock.restart()
accumulator += elapsedTime
accumulator
< TIMESTEP (10ms)?
YES
Sleep if unfocused
(save battery @ ~5 FPS)
return — no work to do
NO
accumulator > 2s?
(debugger paused?)
YES
Clamp accumulator
= TIMESTEP × 2 (20ms)
NO
FIXED UPDATE LOOP — while (accumulator > TIMESTEP)
loop back
accumulator
> TIMESTEP?
NO — exit loop
YES
accumulator -= TIMESTEP · TOTAL_ELAPSED_TIME += TIMESTEP
loadNextQueuedLevel() if level change queued
pollInput() — window events + controller state
doFixedUpdate(TIMESTEP = 10ms)
① Box2D physics world step
② updateLevel(dt) — update() called on every CHRenderTarget in the scene
③ UI, camera, audio, particles, floating text, Steam callbacks
Time factor applied per-level (slow-motion support)
processRenderResults()
Drain render thread result queue · return leases · track draw call metrics
submitRenderTask()
syncCollectRenderData() · lease snapshot · RENDER_THREAD→submitRender()
Frame Complete