perf(content): close prepared asset cutover
This commit is contained in:
parent
b1ad4b7c0a
commit
a564c4b782
11 changed files with 428 additions and 66 deletions
|
|
@ -0,0 +1,134 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"capturedUtcDate": "2026-07-24",
|
||||
"binaryCommit": "b1ad4b7c0a0a519ab36d707baba74890634e6028",
|
||||
"result": "pass",
|
||||
"visualGate": {
|
||||
"status": "user-accepted",
|
||||
"date": "2026-07-24",
|
||||
"note": "Geometry, materials, textures, and world presentation accepted. Raw cross-run pixel differences were attributable to world lighting and post-turn camera state; no comparison tolerance was loosened."
|
||||
},
|
||||
"pak": {
|
||||
"formatVersion": 1,
|
||||
"bakeToolVersion": 3,
|
||||
"datIterations": {
|
||||
"portal": 2072,
|
||||
"cell": 982,
|
||||
"highRes": 497,
|
||||
"language": 994
|
||||
},
|
||||
"keys": {
|
||||
"gfxObj": 15318,
|
||||
"setup": 5935,
|
||||
"envCell": 729888,
|
||||
"total": 751141
|
||||
},
|
||||
"bytes": 29562150456,
|
||||
"gibibytes": 27.53,
|
||||
"validation": "pass"
|
||||
},
|
||||
"runs": {
|
||||
"capped": {
|
||||
"baselineStem": "connected-r6-soak-20260724-141608",
|
||||
"candidateStem": "connected-r6-soak-20260724-151701",
|
||||
"candidateFrames": 111997,
|
||||
"candidateRouteSeconds": 503.8,
|
||||
"cpuMicroseconds": {
|
||||
"baseline": { "p50": 4287, "p95": 6972, "p99": 9404 },
|
||||
"candidate": { "p50": 4247, "p95": 5873, "p99": 7814 }
|
||||
},
|
||||
"gpuMicroseconds": {
|
||||
"baseline": { "p50": 1702, "p95": 3261, "p99": 3847 },
|
||||
"candidate": { "p50": 1836, "p95": 2694, "p99": 3078 }
|
||||
},
|
||||
"frameAllocationBytes": {
|
||||
"baselineMaximum": 213380600,
|
||||
"candidateMaximum": 49066536
|
||||
},
|
||||
"runtime": {
|
||||
"baselineAllocatedBytes": 22611515504,
|
||||
"candidateAllocatedBytes": 10207585632,
|
||||
"baselineGcPauseSeconds": 2.9,
|
||||
"candidateGcPauseSeconds": 1.368,
|
||||
"baselineGcCollections": { "gen0": 191, "gen1": 159, "gen2": 54 },
|
||||
"candidateGcCollections": { "gen0": 82, "gen1": 84, "gen2": 26 },
|
||||
"baselineInvalidSetupProbeExceptions": 4851,
|
||||
"candidateInvalidSetupProbeExceptions": 0
|
||||
},
|
||||
"warmCaulPlateauMibibytes": {
|
||||
"workingSetGrowth": 80.6,
|
||||
"privateGrowth": 53.8
|
||||
},
|
||||
"result": "pass"
|
||||
},
|
||||
"uncapped": {
|
||||
"baselineStem": "connected-r6-soak-20260724-142604",
|
||||
"candidateStem": "connected-r6-soak-20260724-153039",
|
||||
"candidateFrames": 252334,
|
||||
"candidateRouteSeconds": 497.893,
|
||||
"cpuMicroseconds": {
|
||||
"baseline": { "p50": 1520, "p95": 5694, "p99": 7825 },
|
||||
"candidate": { "p50": 1409, "p95": 4909, "p99": 6496 }
|
||||
},
|
||||
"gpuMicroseconds": {
|
||||
"baseline": { "p50": 897, "p95": 3239, "p99": 3406 },
|
||||
"candidate": { "p50": 832, "p95": 2510, "p99": 2706 }
|
||||
},
|
||||
"frameAllocationBytes": {
|
||||
"baselineMaximum": 212712648,
|
||||
"candidateMaximum": 41885648
|
||||
},
|
||||
"runtime": {
|
||||
"baselineAllocatedBytes": 25308730712,
|
||||
"candidateAllocatedBytes": 14738650240,
|
||||
"baselineGcPauseSeconds": 2.567,
|
||||
"candidateGcPauseSeconds": 1.325,
|
||||
"baselineGcCollections": { "gen0": 278, "gen1": 143, "gen2": 58 },
|
||||
"candidateGcCollections": { "gen0": 188, "gen1": 83, "gen2": 23 },
|
||||
"baselineInvalidSetupProbeExceptions": 4659,
|
||||
"candidateInvalidSetupProbeExceptions": 0
|
||||
},
|
||||
"warmCaulPlateauMibibytes": {
|
||||
"workingSetGrowth": 232.0,
|
||||
"privateGrowth": 183.7
|
||||
},
|
||||
"result": "pass"
|
||||
},
|
||||
"denseArwic": {
|
||||
"baselineStem": "connected-dense-town-20260724-143503",
|
||||
"candidateStem": "connected-dense-town-20260724-153930",
|
||||
"candidateFrames": 16732,
|
||||
"candidateRouteSeconds": 57.394,
|
||||
"cpuMicroseconds": {
|
||||
"baseline": { "p50": 3672, "p95": 6561, "p99": 14121 },
|
||||
"candidate": { "p50": 3487, "p95": 6044, "p99": 12432 }
|
||||
},
|
||||
"gpuMicroseconds": {
|
||||
"baseline": { "p50": 2476, "p95": 3284, "p99": 3752 },
|
||||
"candidate": { "p50": 2126, "p95": 2768, "p99": 3122 }
|
||||
},
|
||||
"frameAllocationBytes": {
|
||||
"baselineMaximum": 29875456,
|
||||
"candidateMaximum": 28200384
|
||||
},
|
||||
"runtime": {
|
||||
"baselineAllocatedBytes": 5602582864,
|
||||
"candidateAllocatedBytes": 2136709504,
|
||||
"baselineGcPauseSeconds": 0.623,
|
||||
"candidateGcPauseSeconds": 0.286,
|
||||
"baselineGcCollections": { "gen0": 53, "gen1": 34, "gen2": 14 },
|
||||
"candidateGcCollections": { "gen0": 19, "gen1": 19, "gen2": 7 },
|
||||
"baselineInvalidSetupProbeExceptions": 331,
|
||||
"candidateInvalidSetupProbeExceptions": 0
|
||||
},
|
||||
"result": "pass"
|
||||
}
|
||||
},
|
||||
"focusedValidation": {
|
||||
"preparedSourceSerializerAndEquivalence": { "passed": 20, "failed": 0 },
|
||||
"fullBakeDeterminismAndArtifact": { "passed": 2, "failed": 0 },
|
||||
"releaseBuild": "pass",
|
||||
"completeReleaseSuite": { "passed": 8076, "skipped": 5, "failed": 0 }
|
||||
},
|
||||
"artifactPolicy": "The validated full pak is an untracked machine-local production input beside the DAT files. Raw routes, counters, screenshots, and logs remain untracked; this report is path-free committed evidence."
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
# Slice C prepared-asset cutover report
|
||||
|
||||
**Date:** 2026-07-24
|
||||
|
||||
**Measured binary:** `b1ad4b7c0a0a519ab36d707baba74890634e6028`
|
||||
|
||||
**Result:** pass
|
||||
|
||||
Slice C moves production world-mesh preparation out of the live client.
|
||||
`acdream-bake` converts installed retail DAT geometry and material metadata
|
||||
into an immutable `acdream.pak`; production streaming now reads those prepared
|
||||
records without reconstructing the same DAT object graphs during portals.
|
||||
DAT remains authoritative for simulation, UI, animation, dynamic appearance,
|
||||
physics, audio, and effects.
|
||||
|
||||
The user's connected screenshot review passed on 2026-07-24. Raw screenshot
|
||||
differences against Slice A were caused by non-identical world lighting and
|
||||
post-turn camera state; the user confirmed the prepared path's geometry,
|
||||
materials, textures, and world presentation look correct. No tolerance was
|
||||
widened and no world pixels were masked to obtain that result.
|
||||
|
||||
## Production package
|
||||
|
||||
| Measure | Result |
|
||||
|---|---:|
|
||||
| Format / bake-tool version | 1 / 3 |
|
||||
| GfxObj keys | 15,318 |
|
||||
| Setup keys | 5,935 |
|
||||
| EnvCell keys | 729,888 |
|
||||
| Total TOC keys | 751,141 |
|
||||
| Portal / Cell / HighRes / Language iteration | 2072 / 982 / 497 / 994 |
|
||||
| Artifact size | 29,562,150,456 bytes (27.53 GiB) |
|
||||
| Header, TOC, ranges, aliases, CRCs, and iterations | pass |
|
||||
|
||||
Bake-tool version 3 persists each texture batch's exact translucency
|
||||
classification. That lets the render thread consume the prepared record
|
||||
directly instead of rebuilding a `GfxObjMesh` solely to recover material
|
||||
metadata. The validated package is a required machine-local production input
|
||||
beside the DAT files; it is not a repository artifact.
|
||||
|
||||
Focused installed-DAT validation passed 20 prepared-source, serializer, and
|
||||
pak-equivalence tests plus two full-bake determinism/artifact tests. The
|
||||
complete Release suite passed 8,076 tests with five skips and zero failures.
|
||||
|
||||
## Connected physical-display result
|
||||
|
||||
All three runs used the committed reference AMD display configuration, a
|
||||
source-matched Release binary, the same deterministic routes as Slice A, and
|
||||
normal retained gameplay UI. Every destination materialized, movement/jump/
|
||||
combat exercises passed, and every client disconnected gracefully.
|
||||
|
||||
| Capture | CPU p50 / p95 / p99 | GPU p50 / p95 / p99 | Frame allocation max |
|
||||
|---|---:|---:|---:|
|
||||
| Capped Slice A | 4.287 / 6.972 / 9.404 ms | 1.702 / 3.261 / 3.847 ms | 203.5 MiB |
|
||||
| Capped Slice C | 4.247 / 5.873 / 7.814 ms | 1.836 / 2.694 / 3.078 ms | 46.8 MiB |
|
||||
| Uncapped Slice A | 1.520 / 5.694 / 7.825 ms | 0.897 / 3.239 / 3.406 ms | 202.9 MiB |
|
||||
| Uncapped Slice C | 1.409 / 4.909 / 6.496 ms | 0.832 / 2.510 / 2.706 ms | 39.9 MiB |
|
||||
| Dense Arwic Slice A | 3.672 / 6.561 / 14.121 ms | 2.476 / 3.284 / 3.752 ms | 28.5 MiB |
|
||||
| Dense Arwic Slice C | 3.487 / 6.044 / 12.432 ms | 2.126 / 2.768 / 3.122 ms | 26.9 MiB |
|
||||
|
||||
The capped path improved CPU p95/p99 by 15.8%/16.9% and GPU p95/p99 by
|
||||
17.4%/20.0%. The uncapped path improved CPU p95/p99 by 13.8%/17.0% and GPU
|
||||
p95/p99 by 22.5%/20.6%. Dense Arwic improved CPU p99 by 12.0% and GPU p99 by
|
||||
16.8%. Capped GPU p50 rose by 0.134 ms, but every capped GPU tail percentile
|
||||
improved; neither the uncapped nor dense captures repeated that median cost.
|
||||
|
||||
## Allocation, GC, and probe result
|
||||
|
||||
| Capture | Process allocation | GC pause | Gen0 / Gen1 / Gen2 | Invalid Setup probe exceptions |
|
||||
|---|---:|---:|---:|---:|
|
||||
| Capped Slice A | 22.61 GB | 2.900 s | 191 / 159 / 54 | 4,851 |
|
||||
| Capped Slice C | 10.21 GB | 1.368 s | 82 / 84 / 26 | 0 |
|
||||
| Uncapped Slice A | 25.31 GB | 2.567 s | 278 / 143 / 58 | 4,659 |
|
||||
| Uncapped Slice C | 14.74 GB | 1.325 s | 188 / 83 / 23 | 0 |
|
||||
| Dense Slice A | 5.60 GB | 0.623 s | 53 / 34 / 14 | 331 |
|
||||
| Dense Slice C | 2.14 GB | 0.286 s | 19 / 19 / 7 | 0 |
|
||||
|
||||
Process allocation fell 54.9% capped, 41.8% uncapped, and 61.9% in dense
|
||||
Arwic. GC pause time fell 52.8%, 48.4%, and 54.1%, respectively. The explicit
|
||||
prepared Setup presence probe eliminated the normal-control-flow
|
||||
`ArgumentOutOfRangeException` storm without swallowing unexpected failures.
|
||||
|
||||
The largest frame-thread allocation fell 77.0% capped and 80.3% uncapped.
|
||||
This slice therefore removed most of the portal decode spike even though the
|
||||
2026-07-24 audit correctly assigned the remaining publication/retirement work
|
||||
to cost-budgeted streaming Slice E.
|
||||
|
||||
## Residency interpretation
|
||||
|
||||
Both repeated-Caul routes passed the existing warm-return/plateau memory
|
||||
assertion without changing its threshold:
|
||||
|
||||
- capped Caul return to plateau: +80.6 MiB working set, +53.8 MiB private;
|
||||
- uncapped Caul return to plateau: +232.0 MiB working set, +183.7 MiB private.
|
||||
|
||||
Handles and threads also returned to their established bands. First-to-final
|
||||
working set is higher than Slice A because Windows includes clean pages from
|
||||
the 27.53 GiB memory-mapped package in process working set. Those pages are
|
||||
discardable file cache, not private heap or retained world ownership. Private
|
||||
memory remained bounded across warm revisits, while entity, animation,
|
||||
particle, mesh-upload, teardown, and ownership invariants passed.
|
||||
|
||||
This is a correctness-first package, not the final disk/residency format.
|
||||
Deduplication and compression may reduce its footprint later, but they were
|
||||
deliberately excluded from the byte/field-equivalence cutover.
|
||||
|
||||
## Architecture closeout
|
||||
|
||||
- Production `ObjectMeshManager` reads only `IPreparedAssetSource`; it has no
|
||||
live-DAT extraction fallback.
|
||||
- `DatPreparedAssetSource` remains explicit tooling/equivalence infrastructure.
|
||||
- GfxObj, Setup, and EnvCell identities are typed and validated.
|
||||
- Missing, corrupt, canceled, and loaded reads remain distinct.
|
||||
- Portal DAT wins the non-allocating preferred-ID lookup.
|
||||
- Worker preparation and render-thread GL upload ownership remain unchanged.
|
||||
- Mesh workers stop before the package is unmapped during shutdown.
|
||||
- Prepared-source probe/read/result counters are exposed in the existing
|
||||
render resource diagnostic record.
|
||||
|
||||
Machine-readable, path-free evidence is in
|
||||
[`2026-07-24-slice-c-prepared-asset-cutover-report.json`](2026-07-24-slice-c-prepared-asset-cutover-report.json).
|
||||
Raw frame histories, counters, reports, screenshots, and logs remain local
|
||||
untracked diagnostic artifacts.
|
||||
Loading…
Add table
Add a link
Reference in a new issue