Reaching 120 FPS at Native 4K: The 3.5 ms That Wasn't Where We Looked
A CPU-bound frame, an 80% sub-bracket, four neutral fixes, and twelve NPCs sharing one 103,440-vertex mesh.
Visibility prep after bone bounds
3.23 ms to 0.107 ms
After switching to skeleton bone bounds: visibility prep 3.23 ms to 0.107 ms; 4K wall 8.15 to 4.98 ms in one A/B; 4K bench whole-path p50 6.75 ms (about 148 FPS).
Visibility prep share of CPU prep
80.0%
Sub-bracket attribution: visibility prep 3.571 ms = 80.0% of CPU prep, sweeping 2,397 entities to draw 50, with about 0 bounds rebuilt per frame. Sub-brackets summed to 4.409 ms vs a 4.461 ms parent (+0.051 ms residual, +1.14%).
Baseline CPU wall p50
10.499 ms
Baseline native 4K: CPU wall p50 10.499 ms (95.2 FPS); GPU device envelope p50 2.411 ms.
Actual owner
12 wandering NPCs
Actual owner: 12 wandering NPCs sharing one 103,440-vertex rest mesh, causing 12 full bounds walks of about 1.24M vertices per frame.
Empirical Findings Table
CPU-bound native 4K frame, sub-bracket attribution, and the real owner| Telemetry Metric | Measured Value | Context & Observability |
|---|---|---|
| Visibility prep after bone bounds | 3.23 ms to 0.107 ms | After switching to skeleton bone bounds: visibility prep 3.23 ms to 0.107 ms; 4K wall 8.15 to 4.98 ms in one A/B; 4K bench whole-path p50 6.75 ms (about 148 FPS). |
| Visibility prep share of CPU prep | 80.0% | Sub-bracket attribution: visibility prep 3.571 ms = 80.0% of CPU prep, sweeping 2,397 entities to draw 50, with about 0 bounds rebuilt per frame. Sub-brackets summed to 4.409 ms vs a 4.461 ms parent (+0.051 ms residual, +1.14%). |
| Baseline CPU wall p50 | 10.499 ms | Baseline native 4K: CPU wall p50 10.499 ms (95.2 FPS); GPU device envelope p50 2.411 ms. |
| Actual owner | 12 wandering NPCs | Actual owner: 12 wandering NPCs sharing one 103,440-vertex rest mesh, causing 12 full bounds walks of about 1.24M vertices per frame. |
| Prep bracket share of intercept | 78% | Wall vs render scale fit: T(s) = 5.63 + 4.87·s² ms. The CPU prep bracket was 4.378 ms, 78% of the intercept and 42% of the native wall, and did not change with render scale. |
| Candidate fixes before the owner | neutral | Candidate fixes in sequence: grid pre-filter neutral; static/dynamic partition neutral; flat cache 8%; supplied bounds zero; a static-prop premise falsified. |
| Bounds containment failures | 0 failures | Containment check of the new bounds against posed vertices: 0 failures over 14,336 samples. |
Engineering Action Directives
- When the GPU envelope is a fraction of the wall, shader and resolution work cannot close the gap; attributing the CPU side, with a work counter beside each timer, is what turned a single 4 ms number into a specific owner.
- The counters ruled out the plausible suspects (descriptor churn, vector growth, static rebuilds) but did not name the true cause. That took a further bisection, which suggests attribution narrows the search but does not end it.
Methodology Boundaries & Limits
- One scene and camera anchor; other anchors with more water, foliage or crowds have different owners.
- Sub-bracket p95/p99 were unavailable because the telemetry sampler was too sparse at 4K; only window-median p50 is reported.
- The 3.571 ms and 3.23 ms visibility-prep figures come from different runs and builds and should not be subtracted from each other.
- Hardware is not recorded in these sources; the GPU in the engine's earlier ladder measurements was an RTX 5080.