Files
horizon-airdef/docs/graphics-api-comparison.md
T

73 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Matched graphics API comparison
Three core-profile pairs compare OpenGL with Vulkan at the same stationary view.
On this Linux software renderer, Vulkan produces only 1.22–1.74% more average FPS
while using 11.23–12.95% more process CPU. Frame-time tails and sampled RSS are
mixed, and integrated-server tick execution is slower. Playable backend defaults
remain unchanged. These results do not predict physical M2 GPU performance.
## Protocol
Each fresh process uses the exact published 0.20.0 mod, identical core mods,
private camera fixture, initial world copy and 3 GiB maximum / 512 MiB initial
heap. Both APIs use 12 full-detail / 12 simulation chunks, 1280×800, FOV 70,
uncapped FPS, no LOD/shaders, G1 and compact headers. Every original experimental
controller is disabled. The private camera is fixed and world copies use Peaceful
difficulty with noon/weather advancement rules fixed. Playable packs retain
normal rules.
Runs warm for 180 seconds, then record frames and ticks for 120 seconds. Each
pair runs OpenGL first and Vulkan second. Actual devices report llvmpipe LLVM
21.1.8, with Mesa 26.0.8 OpenGL 4.5 or Vulkan 1.4.335. The Vulkan preference is
verified against the observed backend; a fallback would invalidate this series.
The host is an i7-7500U with 2 physical cores / 4 logical processors and about
30.2 GiB system RAM. Native GPU access is unavailable to this user.
## Results
| Pair | OpenGL FPS | Vulkan FPS | OpenGL CPU | Vulkan CPU | OpenGL peak RSS | Vulkan peak RSS | Tick mean, OpenGL → Vulkan |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 1 | 6.5786 | 6.6765 | 2.895 cores | 3.248 cores | 2,362.36 MiB | 2,337.00 MiB | 6.455 → 7.460 ms |
| 2 | 6.5869 | 6.6671 | 2.918 cores | 3.246 cores | 2,471.90 MiB | 2,526.52 MiB | 6.845 → 7.602 ms |
| 3 | 6.5632 | 6.6775 | 2.879 cores | 3.252 cores | 2,424.70 MiB | 2,459.63 MiB | 6.499 → 7.593 ms |
Paired FPS changes are +1.49%, +1.22%, +1.74%, with a descriptive arithmetic
mean of +1.48%. CPU changes are +12.18%, +11.23%, +12.95% (mean +12.12%).
These three fixed-order pairs do not establish statistical significance.
p95 frame intervals change −2.08%, +0.94%, −1.43%; slowest-1%-average FPS
changes −2.19%, −7.63%, +5.49%. Peak sampled RSS changes −1.07%, +2.21%,
+1.44%. GC accounting is mixed and is not a measured stop-the-world pause total.
Tick execution means increase 11.06–16.84%, while observed invocation throughput
remains near 20 TPS with normal sampled tick-manager state in all runs.
Process CPU includes native rendering and the integrated server. Higher tick
durations in a shared rendering process do not isolate a server algorithm change
or establish dedicated-server capacity. Tick reports do not capture the client
graphics API; their captured-settings match must be interpreted alongside each
paired frame report's explicit backend/driver differences.
## Validation and limits
All six clients save and exit cleanly. Raw frame/tick CSV counts and mean durations
match the JSONs, with zero exclusions/drops. Runtime and fixture hashes, mod
identities, other captured settings, saved camera/position and clock/weather rules
match. Frame comparisons retain only the deliberate backend/driver mismatches.
Both first-pair warmed views were visually inspected before recording and showed
the same forest/terrain. This is not an exhaustive pixel-equivalence test.
All three actual frame/tick JSON+CSV pairs pass desktop/mobile viewer and chart
checks; representative screenshots were inspected. The
[selected observations](../benchmarks/graphics-api-2026-10-04/live-observations.json)
retain all six runs, every paired metric, configuration, device identities and
private capture/fixture hashes. Raw logs, CSVs, images and worlds remain private.
One stationary view, a software renderer, fixed order and three pairs cannot
establish movement/generation behavior, native GPU or Mac speedups, full visual
equivalence or populated-server capacity. OS cache, JIT, entities and thermal
effects can still vary. Sampled RSS covers the settled recording, can miss spikes
and is not complete GPU/unified-memory accounting. Do not pool these API pairs
with heap or vanilla/core experiments. See the [Mac procedure](mac-first-test.md)
for physical-device comparisons and the [graphics probes](client-graphics-smoke.md)
for separate hosted-Mac startup results.