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.
This commit is contained in:
parent
49f3a48ee6
commit
2421d09f5d
6 changed files with 335 additions and 19 deletions
89
docs/research/2026-07-24-slice-a-physical-local-baselines.md
Normal file
89
docs/research/2026-07-24-slice-a-physical-local-baselines.md
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
# 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`](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`](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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue