HullRender budget
Render budget

40,231 meshes.
480 drawn.

Every game on the engine gets a render budget with zero code. It works out what moves and what stands still, then spends detail where the camera is.

Apple M5 Pro, 1920×1080, High quality, vsync off

Before and after

The 300 by 300 metre test city from above with every optimisation off: 40,231 meshes drawn
The same view with the defaults: far props faded and far buildings swapped for flat copies, 480 meshes drawn
40,231 drawn, all off480 drawn, defaults

Drag the split. Far props dither out, far buildings become flat copies tinted with their texture's average colour, and cells beyond the view are not spawned at all. Near the camera nothing changes.

How it works

Four rules, no tags needed

  1. 1

    Classify

    Tags win if you set them: Actor or Scenery. Untagged meshes under a camera, skinned, morphed or under a moving rigid body are actors at once. The rest are watched for 60 frames and become scenery if they did not move. Scenery that moves later turns back into an actor.

  2. 2

    Spend detail by distance

    Props under 1.5 m stop casting shadows past 50 m and fade past 60 m. Bigger pieces switch to a far twin at 80 m and vanish at 170 m. Set the view distance to where your fog turns opaque and the edge is never seen. Actors are never changed.

  3. 3

    Stream big maps

    Register scenery as data with SceneryStream and cells around the camera spawn nearest first, 64 per frame, with hysteresis on the way out. Colliders are never streamed: physics, AI raycasts and navigation always see the whole map.

  4. 4

    Rest the GPU in menus

    Menus, pause and boot redraw at 30 Hz when focused and 8 Hz when not. Gameplay stays continuous. GPU busy in menus dropped from 85 to 92% to 21 to 32%.

Distance detail, explained

Distance detail on a range benchA cine camera at the end of a long range bench with a metre ruler. Range markers slide along the front edge at 50, 60, 80 and 170 metres at High quality. Small crates and barrels nearer than 50 m cast shadows, lose them past 50 m and dither out past 60 m. Towers switch to a flat far twin past 80 m and vanish past 170 m. A probe crate rides a sled down the bench, and a figure standing at 196 m keeps full detail and its shadow.

  • Full detail 7
  • No shadow 1
  • Dithered out 4
  • Far twin 3
  • Gone 3
  • Actor, never changed
  • Collider, never touched
  • Markers: shadow, small props, far, view

The render budget sorts static scenery by its distance from the camera. Props smaller than 1.5 m stop casting shadows past 50 m and dither out past 60 m. Bigger pieces swap to a flat far twin past 80 m, tinted with their texture's average colour. Nothing draws past 170 m, where a game's fog turns opaque. Actors keep full detail and shadows, and colliders never change, so physics and AI still see the whole map. Each preset scales every range: Low 0.6, Medium 0.8, High 1.0, Ultra 1.5.

Measurements

The numbers

A 300 × 300 m city: 100 ground tiles, about 170 buildings and 120 yard walls that occlude, 20 walking actors. Each row is 7 seconds at a fixed camera pose, driven over the control port, with the optimisations toggled at runtime. "Drawn" is meshes the camera drew over meshes in the world.

40,000 props
PoseDrawn, offDrawn, defaultp95 msGPU msFPS
overview40,231 / 40,644480 / 19,3154.54 to 3.073.51 to 2.58268 to 350
street32,238 / 40,6441,736 / 32,1724.97 to 3.423.76 to 2.95259 to 323
walk9,570 / 40,6441,620 / 35,6054.15 to 3.633.14 to 2.89279 to 308
4,000 props
PoseDrawn, offDrawn, defaultp95 msp95 with occlusion
street3,484 / 4,644351 / 3,7324.23 to 3.383.61
overview4,334 / 4,644160 / 2,2543.28 to 3.273.44
yard3,442 / 4,644262 / 2,7653.43 to 3.253.70
walk1,344 / 4,644189 / 4,0213.39 to 3.184.26
  • Idle skip, opt-inOn a still street view a frame where nothing visible changed is simulated but not drawn. GPU busy went from 79% to 2%; 342 of about 350 frames were skipped over 6 s, and screenshots taken while skipping are correct.
    79% to 2%
  • Zero configThe same city with no Actor or Scenery tags at all gives identical counts and frame times.
    Identical
  • Its own costAbout 30 µs per frame at 4.6k meshes and 200 to 320 µs at 40k, mostly dev-only per-mesh counters that are off in ship builds.
    ~30 µs
  • Where it showsThe empty city still costs 2.5 to 3.5 ms of GPU at High: SSAO, TAA, bloom and three shadow cascades dominate. Culling shows most where geometry is heavy, and on weaker GPUs.
    Honest
Tried and dropped

What did not make the cut

  • Opt-in

    GPU occlusion culling by default

    3 to 15% slower in every pose. Walking p95 went from 3.39 to 4.26 ms: the depth prepass and two-phase culling cost more than the draws they save with GPU-driven batching.

  • Dropped

    Trimming shadows of big scenery at 50 m

    A building’s shadow vanishing at mid range is visible in screenshots. Only small props lose shadows; big pieces keep theirs until the far twin takes over.

  • Option

    Hide-mode streaming of spawned scenery

    No measurable gain over distance detail, which already stops drawing it.

  • Dropped

    Streaming biased toward the view direction

    An FPS turns 180° in about 0.1 s and frustum culling already skips what is behind. Not worth the pop-in risk.

Walking pose in the test city with the defaults on: a brick yard wall, a building and props at close range, all at full detail
Walking pose, defaults: 1,536 meshes drawn of 35,098
Shroud's office map at High quality: desks, monitors and ceiling panels
Shroud's arenas are small: at High nothing is far enough to change