From 2421d09f5dc5e34e9dd003466aa435dcc443bad0 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 24 Jul 2026 14:41:50 +0200 Subject: [PATCH] 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. --- docs/plans/2026-04-11-roadmap.md | 19 +- .../2026-07-24-modern-runtime-architecture.md | 26 ++- ...7-24-slice-a-physical-local-baselines.json | 216 ++++++++++++++++++ ...-07-24-slice-a-physical-local-baselines.md | 89 ++++++++ .../2026-07-24-slice-a-rdp-baselines.json | 2 +- .../2026-07-24-slice-a-rdp-baselines.md | 2 +- 6 files changed, 335 insertions(+), 19 deletions(-) create mode 100644 docs/research/2026-07-24-slice-a-physical-local-baselines.json create mode 100644 docs/research/2026-07-24-slice-a-physical-local-baselines.md diff --git a/docs/plans/2026-04-11-roadmap.md b/docs/plans/2026-04-11-roadmap.md index 17f40b74..243d7d09 100644 --- a/docs/plans/2026-04-11-roadmap.md +++ b/docs/plans/2026-04-11-roadmap.md @@ -1562,8 +1562,8 @@ port in any phase — no separate listing here. > remains DEFERRED**: ECS is the *throughput* lever (raise avg FPS ~230→300), a > DIFFERENT goal from steadiness — revisit ONLY if the user wants a higher raw FPS > number and accepts the rewrite risk. Rust rejected. Parked (resume from the table -> below): MP1b pak/bake is now complete; MP1c remains gated on corrected -> physical-local baselines. The remaining parked items are +> below): MP1b pak/bake is now complete and the corrected physical-local +> baselines have landed, so MP1c is active. The remaining parked items are > MP-Alloc hard sites and MP1c. MP2 has shipped. Full rationale: > `project_mp_track_findings.md`. > The 2026-07-18 portal/resource-lifetime repair does not resume MP's ECS, pak, @@ -1582,11 +1582,14 @@ port in any phase — no separate listing here. > unifies the unfinished MP pak/render-world work with future Track LH, preserves > retail-shaped simulation and the N.5 renderer, and reorders execution around > prepared content and cost-budgeted streaming before render-ECS throughput. -> **Execution update 2026-07-24:** Slice A's corrected tooling and diagnostic -> RDP captures have landed. The committed evidence includes capped/uncapped -> nine-stop routes, dense Arwic, portal windows, observer-effect measurement, -> binary provenance, and contention stacks. The physical-local AMD-display gate -> remains open and blocks Slice C. Slice B EnvCell dedup is complete; its +> **Execution update 2026-07-24:** Slice A's corrected tooling, diagnostic RDP +> captures, and authoritative physical-local captures have landed. The +> committed evidence includes capped/uncapped nine-stop routes, dense Arwic, +> portal windows, observer-effect measurement, binary provenance, and +> contention stacks. The physical runs confirm fast steady rendering but also +> preserve repeated-portal memory plateau failures, ~200 MiB allocation frames, +> and thousands of invalid typed-Setup probes as MP1c's before-state. Slice C +> is unblocked and active. Slice B EnvCell dedup is complete; its > [full-bake report](../research/2026-07-24-slice-b-full-bake-report.md) > records the 42.6× result and corrected geometry-identity collision. @@ -1613,7 +1616,7 @@ hitch and follows. | MP1b | Pak format + `acdream-bake` CLI + mmap `PakReader` + equivalence/full-scale gate | ✅ **SHIPPED 2026-07-24** — 729,888 EnvCell keys → 17,117 unique geometries + 712,771 aliases (42.6×), 751,141 total keys / 38,370 physical blobs, zero failures, 28,192.4 MiB, 81.4 s validated atomic publish; full-DAT gate also corrected a real collision in WB's legacy geometry hash. [Report](../research/2026-07-24-slice-b-full-bake-report.md) | | **MP-Alloc (safe batch)** | Reuse per-frame buffers: anim pose, particle draw-list, interior partition, animatedIds/drawableCells sets | ✅ SHIPPED + USER-GATED 2026-07-05 — dense-town frame-time spikes 20–87ms → 6–10ms, alloc spikes (30–75MB single-frame) eliminated, gen2 GC 5–11/window → ~0; user confirms FPS steady. 4 commits `b8c05e2b`..`91afea24` | | MP-Alloc (hard sites) | EnvCell settled-camera rebuild gate + physics `Transition` pooling — the residual steady ~1.6MB/frame | ⚪ OPTIONAL follow-up — would lower the median too, but the wild-swing complaint is already resolved; each needs its own careful gate (batch correctness / physics faithfulness) | -| MP1c | Streaming cutover to pak + hitch gate | ⏸ blocked on the physical-local corrected Slice A baseline; Slice B package foundation is complete | +| MP1c | Streaming cutover to pak + hitch gate | **ACTIVE 2026-07-24** — physical-local Slice A gate committed; baseline: uncapped CPU p50/p95/p99 1.520/5.694/7.825 ms, GPU 0.897/3.239/3.406 ms, portal allocation max 212.7 MiB, repeated-Caul working-set growth 295.1 MiB. Slice B package foundation is complete | | MP2 | Retail particle distance/cell-view degradation: DAT-authored range, exact infinite/finite off-view update branches, emitter-first render scan, user-requested 2× default range | ✅ SHIPPED 2026-07-17 — Aerlinthe hotspot `0x32000223` resolves to retail 64m and defaults to 128m; landscape/entity streaming distance unchanged | | MP3 | Arch ECS render world + delta submission (the 300-FPS lever) | ⚪ — note: does NOT fix the steady-state GC churn (that's MP-Alloc); MP3 is the draw-submission throughput lever | | MP4 | Zero-alloc frame loop + flat physics data (residual, post-MP-Alloc) | ⚪ hard-queued behind M1.5 #137 | diff --git a/docs/plans/2026-07-24-modern-runtime-architecture.md b/docs/plans/2026-07-24-modern-runtime-architecture.md index ffda8e8e..ad373040 100644 --- a/docs/plans/2026-07-24-modern-runtime-architecture.md +++ b/docs/plans/2026-07-24-modern-runtime-architecture.md @@ -2,8 +2,8 @@ **Date:** 2026-07-24 -**Status:** Slice A tooling and diagnostic RDP baselines landed; Slice B -complete. The physical-local Slice A gate still blocks Slice C. +**Status:** Slice A complete on the physical reference display; Slice B +complete. Slice C is unblocked and active. **Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit. @@ -577,8 +577,14 @@ and uncapped nine-stop RDP routes, a pinned dense-Arwic RDP sample, observer effect, portal windows, and contention stacks are committed in [`../research/2026-07-24-slice-a-rdp-baselines.md`](../research/2026-07-24-slice-a-rdp-baselines.md) and its machine-readable companion. They prove the tooling is usable but are -diagnostic-only. The physical-local AMD-display repetitions remain required, -so Slice C is still blocked. Slice B was baseline-independent and is complete. +diagnostic-only. The authoritative capped/uncapped nine-stop and pinned +dense-Arwic repetitions are committed in +[`../research/2026-07-24-slice-a-physical-local-baselines.md`](../research/2026-07-24-slice-a-physical-local-baselines.md) +and its machine-readable companion. All routes completed and disconnected +gracefully. They also preserve the two repeated-portal memory plateau failures, +~200 MiB portal allocation frames, and typed-Setup exception storm as Slice C's +before-state instead of weakening the gates. Slice A and Slice B are complete; +Slice C is unblocked. ### Slice B — Finish MP1b EnvCell dedup and full bake @@ -1123,11 +1129,13 @@ an improvement" carries the same evidence burden as a regression claim. ## 14. Current execution point -Slice A's tooling and diagnostic RDP evidence are complete, and Slice B's -prepared-content bake is complete. The next implementation is Slice C, but its -physical-local prerequisite remains open. Do not start Slice C until the -capped/uncapped nine-stop and pinned dense-Arwic routes have been repeated on -the physical local AMD display path and committed. +Slice A's tooling and authoritative physical-local evidence are complete, and +Slice B's prepared-content bake is complete. Slice C is active. Its comparison +baseline is the committed physical-local capture at +`49f3a48ee63b82d00731b0f91497930925279c86`: uncapped CPU p50/p95/p99 +1.520/5.694/7.825 ms, GPU p50/p95/p99 0.897/3.239/3.406 ms, portal allocation +max 212.7 MiB, process allocation mean 50.0 MB/s, and a repeated-Caul working +set plateau failure of 295.1 MiB. The intended order is therefore: diff --git a/docs/research/2026-07-24-slice-a-physical-local-baselines.json b/docs/research/2026-07-24-slice-a-physical-local-baselines.json new file mode 100644 index 00000000..72257105 --- /dev/null +++ b/docs/research/2026-07-24-slice-a-physical-local-baselines.json @@ -0,0 +1,216 @@ +{ + "schemaVersion": 1, + "capturedUtcDate": "2026-07-24", + "authority": "physical-local-performance-gate", + "referenceConfig": "docs/research/2026-07-24-performance-reference-configuration.json", + "sourceCommit": "49f3a48ee63b82d00731b0f91497930925279c86", + "binaryCommit": "49f3a48ee63b82d00731b0f91497930925279c86", + "binaryMatchesSource": true, + "trackedSourceCleanAtLaunch": true, + "rawArtifactPolicy": "Raw CSV, EventPipe, screenshot, process report, and runtime logs remain local and uncommitted.", + "captures": [ + { + "name": "capped-nine-stop", + "renderMode": "default-240hz-cap", + "route": "Caul, Sawato, Rynthid, Aerlinthe, Sawato, Holtburg, Caul, Sawato, Caul", + "result": "behavior-pass-graceful-memory-plateau-fail", + "failures": [ + "Caul plateau: private memory grew by 699.8 MiB", + "Caul plateau: working set grew by 685.6 MiB" + ], + "elapsedSeconds": 518.992, + "measuredSeconds": 506.231, + "frames": 107081, + "frameCpuUs": { "p50": 4287, "p95": 6972, "p99": 9404, "p999": 24353, "max": 400864 }, + "gpuUs": { "p50": 1702, "p95": 3261, "p99": 3847, "max": 392882 }, + "frameThreadAllocationBytes": { + "p50": 28736, + "p95": 71792, + "p99": 138872, + "max": 213380600, + "total": 6479379592 + }, + "updateUs": { "p50": 330, "p95": 918, "p99": 1451, "max": 344610 }, + "uploadUs": { "p50": 3, "p95": 14, "p99": 95, "max": 26968 }, + "process": { + "allocationBytesPerSecondMean": 44249541, + "allocationBytesPerSecondMax": 3058988720, + "gcPauseSecondsTotal": 2.900301, + "gcPauseSecondsMax": 0.311808, + "gen0Collections": 191, + "gen1Collections": 159, + "gen2Collections": 54, + "contentions": 7292, + "workingSetBytesMax": 1714360320, + "privateMiBMax": 2193.0, + "argumentOutOfRangeExceptions": 4851 + }, + "caulOwnership": { + "baseline": { + "worldEntities": 21031, + "animatedEntities": 18, + "meshRenderData": 604, + "meshAtlasArrays": 41, + "trackedGpuBytes": 389182880, + "ownedCompositeTextures": 163, + "managedBytes": 236408440, + "managedCommittedBytes": 449298432, + "lohSizeBytes": 177433280, + "lohFragmentationBytes": 91783776 + }, + "plateau": { + "worldEntities": 21025, + "animatedEntities": 13, + "meshRenderData": 560, + "meshAtlasArrays": 40, + "trackedGpuBytes": 426820784, + "ownedCompositeTextures": 120, + "managedBytes": 303350840, + "managedCommittedBytes": 1235050496, + "lohSizeBytes": 258374440, + "lohFragmentationBytes": 156493168 + } + }, + "portalWindows": [ + { "destination": "Caul", "cpuP99Us": 15014, "cpuMaxUs": 133252, "gpuP99Us": 4720, "allocationMaxBytes": 55772024, "updateP99Us": 3533, "uploadP99Us": 341 }, + { "destination": "Sawato", "cpuP99Us": 9807, "cpuMaxUs": 400864, "gpuP99Us": 2825, "allocationMaxBytes": 213252672, "updateP99Us": 1544, "uploadP99Us": 192 }, + { "destination": "Rynthid", "cpuP99Us": 5995, "cpuMaxUs": 274134, "gpuP99Us": 1436, "allocationMaxBytes": 13526920, "updateP99Us": 1297, "uploadP99Us": 168 }, + { "destination": "Aerlinthe", "cpuP99Us": 5108, "cpuMaxUs": 315555, "gpuP99Us": 1383, "allocationMaxBytes": 13427160, "updateP99Us": 744, "uploadP99Us": 91 }, + { "destination": "Sawato-revisit", "cpuP99Us": 5131, "cpuMaxUs": 323338, "gpuP99Us": 2193, "allocationMaxBytes": 213380600, "updateP99Us": 727, "uploadP99Us": 129 }, + { "destination": "Holtburg", "cpuP99Us": 8234, "cpuMaxUs": 292479, "gpuP99Us": 1876, "allocationMaxBytes": 14842560, "updateP99Us": 2160, "uploadP99Us": 599 }, + { "destination": "Caul-return", "cpuP99Us": 13311, "cpuMaxUs": 333240, "gpuP99Us": 4885, "allocationMaxBytes": 36023344, "updateP99Us": 1570, "uploadP99Us": 109 }, + { "destination": "Sawato-plateau", "cpuP99Us": 10072, "cpuMaxUs": 335565, "gpuP99Us": 3314, "allocationMaxBytes": 213099368, "updateP99Us": 1419, "uploadP99Us": 169 }, + { "destination": "Caul-plateau", "cpuP99Us": 9972, "cpuMaxUs": 299721, "gpuP99Us": 5049, "allocationMaxBytes": 36022664, "updateP99Us": 1290, "uploadP99Us": 185 } + ] + }, + { + "name": "uncapped-nine-stop", + "renderMode": "uncapped", + "route": "Caul, Sawato, Rynthid, Aerlinthe, Sawato, Holtburg, Caul, Sawato, Caul", + "result": "behavior-pass-graceful-memory-plateau-fail", + "failures": [ + "Caul plateau: working set grew by 295.1 MiB" + ], + "elapsedSeconds": 511.607, + "measuredSeconds": 501.007, + "frames": 232974, + "frameCpuUs": { "p50": 1520, "p95": 5694, "p99": 7825, "p999": 14316, "max": 366745 }, + "gpuUs": { "p50": 897, "p95": 3239, "p99": 3406, "max": 363685 }, + "frameThreadAllocationBytes": { + "p50": 27912, + "p95": 70496, + "p99": 96224, + "max": 212712648, + "total": 11250290080 + }, + "updateUs": { "p50": 179, "p95": 651, "p99": 1029, "max": 303775 }, + "uploadUs": { "p50": 2, "p95": 14, "p99": 25, "max": 29763 }, + "process": { + "allocationBytesPerSecondMean": 50017254, + "allocationBytesPerSecondMax": 3040363520, + "gcPauseSecondsTotal": 2.567187, + "gcPauseSecondsMax": 0.288320, + "gen0Collections": 278, + "gen1Collections": 143, + "gen2Collections": 58, + "contentions": 5944, + "workingSetBytesMax": 1297494016, + "privateMiBMax": 1731.8, + "argumentOutOfRangeExceptions": 4659 + }, + "caulOwnership": { + "baseline": { + "worldEntities": 21031, + "animatedEntities": 18, + "meshRenderData": 543, + "meshAtlasArrays": 30, + "trackedGpuBytes": 262573784, + "ownedCompositeTextures": 163, + "managedBytes": 271950608, + "managedCommittedBytes": 438009856, + "lohSizeBytes": 249819600, + "lohFragmentationBytes": 155506192 + }, + "plateau": { + "worldEntities": 21025, + "animatedEntities": 13, + "meshRenderData": 560, + "meshAtlasArrays": 37, + "trackedGpuBytes": 393876972, + "ownedCompositeTextures": 120, + "managedBytes": 274691720, + "managedCommittedBytes": 867143680, + "lohSizeBytes": 223628576, + "lohFragmentationBytes": 115311320 + } + }, + "portalWindows": [ + { "destination": "Caul", "cpuP99Us": 14462, "cpuMaxUs": 44835, "gpuP99Us": 3406, "allocationMaxBytes": 355200, "updateP99Us": 1730, "uploadP99Us": 52 }, + { "destination": "Sawato", "cpuP99Us": 7804, "cpuMaxUs": 366745, "gpuP99Us": 3322, "allocationMaxBytes": 148397032, "updateP99Us": 1004, "uploadP99Us": 80 }, + { "destination": "Rynthid", "cpuP99Us": 1946, "cpuMaxUs": 304536, "gpuP99Us": 1153, "allocationMaxBytes": 13062928, "updateP99Us": 627, "uploadP99Us": 49 }, + { "destination": "Aerlinthe", "cpuP99Us": 2227, "cpuMaxUs": 312978, "gpuP99Us": 1244, "allocationMaxBytes": 13556576, "updateP99Us": 329, "uploadP99Us": 18 }, + { "destination": "Sawato-revisit", "cpuP99Us": 3026, "cpuMaxUs": 301905, "gpuP99Us": 1926, "allocationMaxBytes": 212712648, "updateP99Us": 360, "uploadP99Us": 29 }, + { "destination": "Holtburg", "cpuP99Us": 3522, "cpuMaxUs": 300609, "gpuP99Us": 1437, "allocationMaxBytes": 15578112, "updateP99Us": 720, "uploadP99Us": 98 }, + { "destination": "Caul-return", "cpuP99Us": 4304, "cpuMaxUs": 318926, "gpuP99Us": 2287, "allocationMaxBytes": 36022976, "updateP99Us": 957, "uploadP99Us": 69 }, + { "destination": "Sawato-plateau", "cpuP99Us": 8143, "cpuMaxUs": 321871, "gpuP99Us": 3257, "allocationMaxBytes": 145983776, "updateP99Us": 1096, "uploadP99Us": 58 }, + { "destination": "Caul-plateau", "cpuP99Us": 3273, "cpuMaxUs": 300828, "gpuP99Us": 1427, "allocationMaxBytes": 36021144, "updateP99Us": 1111, "uploadP99Us": 63 } + ] + }, + { + "name": "uncapped-dense-arwic", + "renderMode": "uncapped", + "result": "pass-graceful", + "elapsedSeconds": 68.447, + "measuredSeconds": 58.288, + "frames": 15785, + "frameCpuUs": { "p50": 3672, "p95": 6561, "p99": 14121, "p999": 114715, "max": 388321 }, + "gpuUs": { "p50": 2476, "p95": 3284, "p99": 3752, "max": 383673 }, + "frameThreadAllocationBytes": { + "p50": 41680, + "p95": 82352, + "p99": 627032, + "max": 29875456, + "total": 1401888696 + }, + "updateUs": { "p50": 496, "p95": 1125, "p99": 4821, "max": 226228 }, + "uploadUs": { "p50": 3, "p95": 79, "p99": 254, "max": 26022 }, + "stableFiveSeconds": { + "frames": 1044, + "frameCpuUs": { "p50": 4239, "p95": 6139, "p99": 6760 }, + "gpuUs": { "p50": 2712, "p95": 3235, "p99": 3263 }, + "frameThreadAllocationBytes": { "p50": 38400, "max": 13634832 }, + "updateUs": { "p95": 982 }, + "worldEntities": 15530, + "animatedEntities": 111 + }, + "process": { + "allocationBytesPerSecondMean": 88929887, + "allocationBytesPerSecondMax": 1925396448, + "gcPauseSecondsTotal": 0.622912, + "gcPauseSecondsMax": 0.260645, + "gen0Collections": 53, + "gen1Collections": 34, + "gen2Collections": 14, + "contentions": 2396, + "workingSetBytesMax": 970518528, + "privateMiBMax": 1489.0, + "argumentOutOfRangeExceptions": 331 + }, + "portalWindows": [ + { "destination": "Arwic-dense", "cpuP99Us": 9076, "cpuMaxUs": 115845, "gpuP99Us": 3717, "allocationMaxBytes": 29875456, "updateP99Us": 1509, "uploadP99Us": 437 } + ] + } + ], + "gate": { + "sliceAPhysicalLocalEvidenceCommitted": true, + "sliceCUnblocked": true, + "memoryBehaviorAccepted": false, + "requiredSliceCImprovements": [ + "Materially reduce portal single-frame allocation and p99.", + "Remove the invalid typed-Setup exception storm.", + "Reduce process-wide allocation and GC pressure.", + "Pass the repeated-Caul memory plateau assertion without weakening it.", + "Preserve screenshot pixels, gameplay, ownership convergence, and graceful teardown." + ] + } +} diff --git a/docs/research/2026-07-24-slice-a-physical-local-baselines.md b/docs/research/2026-07-24-slice-a-physical-local-baselines.md new file mode 100644 index 00000000..e5351596 --- /dev/null +++ b/docs/research/2026-07-24-slice-a-physical-local-baselines.md @@ -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. diff --git a/docs/research/2026-07-24-slice-a-rdp-baselines.json b/docs/research/2026-07-24-slice-a-rdp-baselines.json index a46c7572..615289f6 100644 --- a/docs/research/2026-07-24-slice-a-rdp-baselines.json +++ b/docs/research/2026-07-24-slice-a-rdp-baselines.json @@ -3,7 +3,7 @@ "capturedUtcDate": "2026-07-24", "authority": "diagnostic-rdp-only", "purpose": "Corrected Slice A tooling validation and directional baseline. This does not satisfy the physical-local exit criterion.", - "referenceConfig": "docs/research/2026-07-24-performance-reference-config.md", + "referenceConfig": "docs/research/2026-07-24-performance-reference-configuration.md", "rawArtifactPolicy": "Raw CSV, EventPipe, screenshot, and process logs remain local and uncommitted. This file contains the sanitized reproducible summary.", "captures": [ { diff --git a/docs/research/2026-07-24-slice-a-rdp-baselines.md b/docs/research/2026-07-24-slice-a-rdp-baselines.md index 70098a71..06736385 100644 --- a/docs/research/2026-07-24-slice-a-rdp-baselines.md +++ b/docs/research/2026-07-24-slice-a-rdp-baselines.md @@ -12,7 +12,7 @@ were both commit `24f898c54d7c6547555a4402543b6a3cd7ced7f6`, the tracked source tree was clean, and the report recorded an exact match. The machine/display contract is defined in -[`2026-07-24-performance-reference-config.md`](2026-07-24-performance-reference-config.md). +[`2026-07-24-performance-reference-configuration.md`](2026-07-24-performance-reference-configuration.md). The full sanitized figures and portal windows are in [`2026-07-24-slice-a-rdp-baselines.json`](2026-07-24-slice-a-rdp-baselines.json). Raw CSV, EventPipe, screenshot, and process logs are intentionally local,