menu_bookDocumentation

Engine Frame Loop Order: FrameStart, Scene Tick, and FrameEnd Sequence

calendar_today May 4, 2026 schedule ~2 min read person patrickjr verified 50

Engine Frame Loop Order

The s&box engine frame loop runs in a specific order each frame. Understanding this is important for knowing when your code runs relative to rendering, physics, and networking.

Per-Frame Order (EngineLoop.RunFrame)

  1. RealTime.Update — updates real-time clock
  2. Time.Update — updates scene time
  3. FrameStart():
- Steam callbacks - Performance stats - Input pump (g_pInputService.Pump()) - File watch callbacks - Texture animation tick - VR frame start - Resource cache pruning - Async task queue drain - IMenuDll.Tick()IGameInstanceDll.Tick()IMenuDll.LateTick()IToolsDll.Tick() - Voice, text rendering - API events and stats - UI simulation (style resolution) - Sound handle tick - Input router frame - Party room tick
  1. SourceEngineFrame() — native engine frame (rendering submission)
  2. FrameEnd():
- Streamer tick - Async task queue drain - VR frame end - Interop string free - Project recompile tick - Frame-end disposables drain - Render target end-of-frame

Scene Tick Order (Scene.SharedTick)

Within IGameInstanceDll.Tick(), the scene ticks in this order:

  1. ISceneStage.Start() events
  2. Network update (SceneNetworkUpdate)
  3. Fixed update loop (physics, OnFixedUpdate)
  4. ProcessDeletes
  5. Signal(StartUpdate)
  6. InternalUpdateOnUpdate on all components
  7. Signal(UpdateBones)
  8. PreRenderOnPreRender on all components
  9. ProcessDeletes
  10. Signal(FinishUpdate)
  11. Sound flush
  12. ISceneStage.End() events

Frame Rate Clamping

The engine sleeps to enforce RenderSettings.MaxFrameRate. When the app is inactive, RenderSettings.MaxFrameRateInactive is used (if lower). Headless servers are capped at 60 FPS. Benchmark mode has no cap.

Was this helpful?