Godot 4.8 GPU A/B Result + Fill-Rate Headroom
Godot 4.8 GPU A/B result + fill-rate headroom (2026-10-11)
Section titled “Godot 4.8 GPU A/B result + fill-rate headroom (2026-10-11)”Parked until the HDR P3 work lands (Chris, 2026-10-11: “come back to them after P3”).
The A/B (ABA, ATV 4K 2nd gen, locked GPU-bound recipe in skill bh-console-live-ab)
Section titled “The A/B (ABA, ATV 4K 2nd gen, locked GPU-bound recipe in skill bh-console-live-ab)”| 8×10 s, nova_shockwave, 100 targets | 4.7 run 1 (302) | 4.7 repeat (302) | 4.8 (303) |
|---|---|---|---|
| total frames | 2712 | 2707 | 3282 (+21%) |
| shockwave on: p50 / p95 ms | 33.4 / 53.5 | 32.8 / 51.8 | 27.4 / 50.0 |
| shockwave on: frames >33 ms per segment | 162 | 155 | 128 |
| shockwave off: p50 / p95 ms | 24.6 / 38.5 | 24.9 / 35.6 | 18.5 / 26.9 |
| shockwave off: frames >33 ms per segment | 56 | 35 | 14 |
| render_cpu ms (A) | 1.02 | 0.95 | 0.89 |
- 4.7 repeats to within noise, so the 4.8 gap is real [Likely]. 4.8’s A side drifted 24→30 ms within its one run (heat?); a second 4.8 run would rule that out, but the B margin is large.
- Against 4.8: ~8% slower sim CPU (det_probe), identical scons flags on both forks so a rebuild won’t fix it; suspects [Guessing] upstream int div/mod overflow checks (1511e91e5e) and the ClassDB→GDType refactor. Needs a profile. 4.8 is a dev branch.
Why 4.8 is faster on the GPU [Likely, not isolated]
Section titled “Why 4.8 is faster on the GPU [Likely, not isolated]”- The main candidate is Godot PR #121392 (Metal backend: explicit barrier sync replaces per-resource hazard tracking), per
docs/research/2026-10-11-godot-4-8-dev-survey.md(branch hdr-colour-space). - Fits the data: same or less CPU per frame, frames finish sooner → less pass-to-pass GPU waiting, not less work.
- Not isolated from the other 4.8 changes: no per-pass GPU timings on ATV (xctrace can’t attach to the wireless ATV; no USB port).
Could we have found it ourselves?
Section titled “Could we have found it ourselves?”Not realistically: spotting serialisation cost needs a GPU trace, and the fix was months of Metal-backend work by Godot’s maintainers. With a profiler, finding that class of problem is realistic; rewriting the backend is not the right lever for us.
The bigger lever: our own fill rate
Section titled “The bigger lever: our own fill rate”- Proof the scene is fill-rate bound: turning
perf_fx_half_resback ON (same CPU work) returns it to 16.7 ms. - So the cost is full-res additive full-screen FX (shockwave, glow/bloom, HDR blit) and their overdraw. 4.8 makes each pass cheaper; how many pixels we draw is our choice.
- Ideas to evaluate (each as a console A/B, toggle-first): half-res only for the costliest effects instead of all; fewer stacked additive layers; merge passes; check MSAA/glow levels per tier; whether HDR (RGBA16F) doubles bandwidth on the costly passes.
Next step (after P3)
Section titled “Next step (after P3)”- Xcode GPU frame capture of the same GPU-bound scene on Chris’s iPhone over a cable (works there; not on the ATV). Get per-pass cost. The GPU differs from the ATV’s but the pass ranking should carry over [Likely].
- Attack the top pass first, A/B on the ATV with the locked recipe.
- Optional: profile the 8% sim CPU regression on 4.8 (Mac, same det_probe).