acdream/docs/research/2026-07-24-slice-a-physical-local-baselines.md
Erik 2421d09f5d docs(perf): commit physical Slice A baselines
Capture the authoritative capped, uncapped, and dense-Arwic routes on the physical AMD display path. Preserve the portal allocation, exception-storm, and repeated-Caul memory failures as MP1c's before-state while unblocking the prepared-asset cutover.
2026-07-24 14:41:50 +02:00

4.7 KiB

Slice A physical-local baselines

Date: 2026-07-24

Authority: performance-gate baseline

Source and measured binary: 49f3a48ee63b82d00731b0f91497930925279c86

The corrected Slice A tooling was exercised on the authoritative physical AMD display path defined by 2026-07-24-performance-reference-configuration.md: RX 9070 XT driver 32.0.31021.5001, 2560 x 1440 at 240 Hz, with the client rendering 1280 x 720 Release gameplay without developer UI. The tracked source tree was clean at every launch, source and binary commits matched exactly, all route actions completed, and all three clients disconnected gracefully.

The full sanitized metrics and every portal window are in 2026-07-24-slice-a-physical-local-baselines.json. Raw CSV, EventPipe, screenshots, logs, and process reports remain local untracked diagnostic artifacts.

Headline measurements

Capture Frames CPU p50 / p95 / p99 GPU p50 / p95 / p99 Frame-thread allocation p50 / max
240 Hz capped nine-stop 107,081 4.287 / 6.972 / 9.404 ms 1.702 / 3.261 / 3.847 ms 28.1 KiB / 203.5 MiB
Uncapped nine-stop 232,974 1.520 / 5.694 / 7.825 ms 0.897 / 3.239 / 3.406 ms 27.3 KiB / 202.9 MiB
Uncapped dense Arwic 15,785 3.672 / 6.561 / 14.121 ms 2.476 / 3.284 / 3.752 ms 40.7 KiB / 28.5 MiB
Dense Arwic, stable 5 s 1,044 4.239 / 6.139 / 6.760 ms 2.712 / 3.235 / 3.263 ms 37.5 KiB / 13.0 MiB

The physical path confirms that ordinary steady rendering is fast. The stable dense-Arwic window contained 15,530 world entities and 111 animated entities while remaining below 6.8 ms CPU p99 and 3.3 ms GPU p99. The 32 ms RDP envelope was therefore a remote-presentation artifact rather than local renderer cost.

Portal materialization remains the dominant transient. Sawato allocated up to 203.5 MiB in one capped frame and 202.9 MiB in one uncapped frame. The uncapped route allocated 11.25 GB on the frame thread in 501 seconds, while the process-wide runtime counter averaged 50.0 MB/s and recorded 58 Gen-2 collections. ArgumentOutOfRangeException was also emitted 4,659 times during that route. This is the invalid typed-Setup probe storm already in Slice C's scope, not an accepted steady-state mechanism.

Repeated-portal memory result

Both nine-stop sessions completed behaviorally but deliberately failed the existing memory plateau assertion:

  • The capped final Caul checkpoint was 685.6 MiB higher in working set and 699.8 MiB higher in private memory than the first Caul checkpoint.
  • The uncapped final Caul checkpoint was 295.1 MiB higher in working set.
  • In the uncapped comparison, world entities returned from 21,031 to 21,025, animated entities from 18 to 13, and owned composite textures from 163 to 120. Managed live bytes changed only 271.95 MB to 274.69 MB, while committed managed memory rose from 438.01 MB to 867.14 MB.
  • The capped comparison likewise ended with fewer mesh records, atlas arrays, and composite textures than the first Caul checkpoint, but committed managed memory rose from 449.30 MB to 1,235.05 MB.

The evidence does not point to retained world ownership. It points to very high allocation churn, LOH fragmentation, and GC heap segment reservation after portal decode. The baseline is intentionally recorded as a failure instead of loosening the assertion; prepared-content Slice C must remove the decode/probe traffic and then repeat this exact gate.

Contention and ownership interpretation

The physical capped route recorded 7,292 runtime contentions. The committed stack-attributed RDP capture remains the attribution oracle because the same code and route ranked DatDatabaseWrapper.TryGet first (75.3%), followed by ObjectMeshManager.ProcessQueue (16.3%) and DecodedTextureCache.GetOrCreate (4.2%). Slice C removes demand from those paths before any lock redesign is considered.

Canonical ownership counters and graceful teardown passed on every run. No pending mesh uploads, landblock retirements, live-entity teardowns, or composite warmups remained at the final checkpoints.

Gate state

Slice A's physical-local exit criterion is complete: a committed 240 Hz capped nine-stop baseline, uncapped nine-stop baseline, pinned uncapped dense-Arwic baseline, and per-portal frame/allocation windows now exist on the reference display path. This unblocks Slice C.

It does not mark the measured memory behavior healthy. The plateau failures, ~200 MiB portal frames, ~50 MB/s process allocation, exception storm, and heap-reservation growth are the before-state that Slice C must materially improve without changing pixels or gameplay.