Performance Targets

Home | Status & Roadmap →

</blockquote>

Core Budget: 512Hz = 1.95ms per Frame

PhaseBudgetTarget
PrePhysics0.4msUser logic, input, AI decisions
Physics Simulation0.8msJolt solver, collision, response
PostPhysics0.3msCollision callbacks, state updates
History Write0.2msTemporal ring buffer write
Overhead0.25msScheduling, atomics, profiling
TOTAL1.95ms512Hz target

Measured (2026-05, RelWithDebInfo)

TestResult
PrePhysics (100K entities)~0.1ms
PrePhysics (1M entities, stress test)~1.0ms
Full logic frame (100K, no physics)~0.3ms with propagation
25-layer pyramid (5,526 entities)~1ms steady, 14.67ms settling spike
100K cubes + 25-layer pyramid (logic)0.73ms steady, 18.74ms settling
205K entities (100K super + 5.5K phys)~1.4ms steady, ~28ms settling
Jolt step (25-layer settling)~12ms settling, <1ms steady

Render Thread

Target: 60–120 FPS (8–16ms per frame) for 100K visible entities.

PhaseBudgetStatus
History Access0.5msRead T-1 and T sections from slab
Culling + Interpolation3.0msFrustum cull, lerp, build InterpBuffer
State Sorting1.0msSort by 64-bit keys (pending)
GPU Upload1.5msDirty-bit selective transfer
Command Encoding2.0msBuild render pass
GPU Submit + Sync0.5msFrame fence, swapchain
TOTAL8.5ms**~117 FPS budget**

Measured

TestResult
100K cubes + 25-layer pyramid (render)~0.88ms (1133 FPS)
205K entities (settling)~3.1ms (320 FPS)
205K entities (steady)~1.5ms (660 FPS)

No frustum culling yet; all entities rendered. Dirty-bit-driven GPU upload operational — only modified entities uploaded per frame.


Input-to-Photon Latency

Target: <16ms (one frame @ 60Hz).

StageAvg
Input Sampling (Sentinel)0.5ms
Logic Processing (Brain)1.95ms (one 512Hz tick)
Render Frame (Encoder)0.7ms
GPU Execution + VSync16.6ms @ 60Hz monitor
Best case total18.75ms

Measured: ~9ms on 240Hz monitor steady state. ~14.3ms under heavy physics load (205K entities settling).


Rollback Performance

Target: <5ms for 128-frame resimulation.

MetricResult
Resim (5 frames, 100K entities)~18ms (full resim, no dirty propagation)
Resim (12 frames, 100K entities)~28ms (crosses 2 physics boundaries)
Jolt RestoreSnapshot<1ms (7KB via `StateRecorderImpl`)
ECS determinismByte-perfect (34MB memcmp)
Jolt determinismByte-perfect (7,436 bytes)
Per-frame SaveSnapshot overhead<0.1ms

Full frame resim includes PrePhysics + Physics Step + FlushPendingBodies + PullActiveTransforms + PostPhysics + PropagateFrame for every frame in the window. Dirty propagation (resim only corrected entities) is designed but not yet wired — expected to reduce resim cost by 10–100× for typical corrections affecting <1% of entities.


Scalability

Entity Count vs Logic Frame Time

Entity CountPrePhysics (512Hz)Notes
10K0.01msTrivial
50K0.08msComfortable
100K~0.1msPrimary target — achieved
1M~1.0msStress test only

Entity Count vs Render Frame Time (no culling)

CountRenderFPS
100K~0.88ms1133
205K (settling)~3.1ms320
205K (steady)~1.5ms660

Memory Targets

Per-Entity Hot Data (Approximate)

ComponentFieldsBytes/entity/frame
CTransform9 fields (pos/rot/scale)36B
CVelocity3 fields24B
CJoltBody4 fields~16B

Temporal Slab (100K entities)

Ring depthLogic framesMemory
8 (minimum)~15.6ms @ 512Hz~270MB
128 (full rollback)~250ms @ 512Hz~34MB field data + ring overhead

Rollback enabled: ~270MB without rollback history; ~34MB field data verified at rollback validation. Total memory usage under active rollback is significantly higher — see EngineConfig::TemporalFrameCount.


Network

Target: 30Hz net tick, <5ms resim per correction.

MetricTarget
Packet send rate30Hz (configurable via NetworkUpdateHz)
Rollback window128 frames (~250ms @ 512Hz)
Resim time<5ms (pending dirty propagation optimization)
Delta compression ratio70–90%
Prediction accuracy>95%

Benchmark Hardware

Tests run on:

  • Intel Core Ultra 9 275HX / AMD Ryzen 9 9950X
  • 32GB / 64GB RAM
  • RTX 5070 Ti / RTX 4070
  • CachyOS Arch Linux, Windows 11
  • Build: RelWithDebInfo

Profiling tools: Tracy (frame timing), MSVC assembly inspection, RenderDoc.