Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Round10/REPORT.md
T
Fr0zkaandClaude Opus 5.5 b9c13c37c0 wip(assembler): round S6 -- in-game cold view counted; workers mostly idle, apply cap not the floor
Direct per-tile trace on the BuildHost actor (owner plan, 2,578 keys): full set
17.4 s legacy; gated coarse-first (after the 9-tile walkable ring) 11.7 s with
the ring still at 0.63 s, but full LOD0 slips 2.3 -> 10.2 s. Startup apply
boost changed nothing (0.4%). 37.6 worker-s over 17.4 s on 10 slots = ~3.3
busy: the floor is admission/work supply. S5's 251 ms staircase was the trace
sampler. Fixed CVar parsing in headless BeginPlay and the 60 m/s crossing
instrument. All three knobs stay opt-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
2026-10-19 06:46:54 +02:00

219 lines
15 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.
# World assembler S6 / M3 Round 10 — in-game cold-view time
**Result:** the 251 ms staircase was trace sampling cadence, not a scheduler tick. On the staged
2,578-key SurfaceWorld actor, the default legacy path reached full residency in 17.412 s. Gated
coarse-first admission reached it in 11.704 s while the walkable ring time stayed at 0.627 s versus
0.632 s. A 12-mesh / 14 ms startup apply budget did not improve the legacy timeline. The remaining
floor is on worker-side work supply/admission, not the game-thread apply budget; the trace does not
isolate why available worker slots stay idle. The 1.57 s aim remains unmet.
This is null-RHI residency evidence, not rendered enclosure proof.
## 1. Cadence and comparison with S5
`AVoxelWorld::UpdateChunksAroundPosition` emits `streaming_sample` only when at least 0.25 s has
elapsed since its previous sample. S5’s near-251 ms per-LOD staircase was quantized by that observer;
it was not a one-LOD-per-tick scheduler throttle. S6 records direct tile-result/apply timestamps and
per-frame `ProcessPendingChunks` samples, so the completion table below does not depend on that
sampler.
S5 reported 3.352–6.367 s for its per-LOD residency samples. The Round 9 report did not retain the
exact BuildHost command line, executable hash, or raw direct-tile trace for that run. S6 uses the
same staged `DA_Settings` SurfaceWorld plan, 25 cm Core scale, 2,578 desired keys, 12-task host setup,
and legacy-order controls, but its direct full-set result is 17.412 s. The 250 ms sampling interval
cannot explain this larger difference. Treat S5’s 3.35–6.37 s values as a different/unidentified
measurement route, not a matched baseline; S6 preserves the direct command lines and hashes below.
The Standalone 3.58–3.64 s S5 measurement was CPU-only over 2,553 keys, so it is also not a matched
BuildHost apply/collision measurement.
## 2. Matched BuildHost actor runs
Fresh sequential processes used the staged owner plan, `CoreVoxelSizeCm=25`, 2,578 desired tiles,
`-corelimit=12` (10 active task slots in the actor trace), null RHI, a manually ticked `UWorld` with
a 16 ms step, and a +Y 600 cm/s move beginning at 30 s. There was no overlapping Unreal process or
build. Full-set time is the actor’s initial desired-set milestone. “LOD0 full” means all 512 visual
LOD0 keys, separate from the 9/9 collision walkable gate.
| Configuration | Full set ready | Walkable ring 9/9 | Full 512-key LOD0 | Count-cap frames / backlog frames | Visible meshes/frame p95/max | Apply CPU p95/max | `UWorld::Tick` spawn p95/max | `UWorld::Tick` walk p95/max |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| Legacy order, authored 4 / 2 ms budget | 17.412 s | 0.632 s | 2.252 s | 78 / 22 | 4 / 4 | 0.77 / 1.62 ms | 1.406 / 5.059 ms | 1.771 / 29.247 ms |
| Legacy order, startup boost on (12 / 14 ms) | 17.346 s | 0.611 s | 2.190 s | 0 / 0 | 4 / 6 | 0.70 / 1.49 ms | 1.301 / 5.429 ms | 1.798 / 28.489 ms |
| Coarse-first after ring gate, authored 4 / 2 ms | **11.704 s** | **0.627 s** | 10.201 s | 118 / 48 | 4 / 4 | 0.82 / 1.44 ms | 1.396 / 5.027 ms | 1.911 / 28.276 ms |
Coarse-first shortened the full desired-set tail by 5.708 s (32.8%) without a walkable-gate
regression. It did not make all near detail ready sooner: full LOD0 moved from 2.252 s to 10.201 s.
The option therefore stays opt-in pending a rendered view/enclosure check. The apply boost removed
cap frames but changed full-set time by only 66 ms (0.4%), so it also stays opt-in. Normal play
continues to use the authored 4 visible-mesh / 2 ms limit. These are `UWorld::Tick` CPU samples in a
manual null-RHI harness, not full rendered frame times. Walk p95 stayed below 2 ms, but the observed
~28–29 ms maxima remain and were not isolated to a single subsystem. Per-frame apply maxima were
1.62 ms legacy and 1.44 ms gated coarse-first.
### Per-LOD cold set
Each pair is **legacy → gated coarse-first**, from direct tile completion events up to the initial
desired-set milestone. Queue values are cumulative tile-seconds, not elapsed wall seconds. The
initial set contains 2,578 tile results; empty results are included in the result count and apply
time.
| LOD | Last tile apply (s) | Worker task (s) | Worker queue (tile-s) | Result queue (tile-s) | GT apply (ms) / results |
|---:|---:|---:|---:|---:|---:|
| 0 | 2.252 → 10.201 | 3.39 → 3.39 | 0.028 → 0.033 | 5.94 → 5.87 | 27.9 → 35.0 / 512 |
| 1 | 4.785 → 11.765 | 3.21 → 3.05 | 0.007 → 0.006 | 4.43 → 4.79 | 17.0 → 20.4 / 448 |
| 2 | 6.609 → 8.567 | 0.70 → 0.71 | 0.012 → 0.006 | 4.77 → 4.90 | 10.9 → 13.0 / 320 |
| 3 | 8.162 → 7.460 | 1.81 → 1.78 | 0.005 → 0.005 | 2.86 → 3.07 | 10.5 → 11.8 / 272 |
| 4 | 10.317 → 6.530 | 6.02 → 6.08 | 0.004 → 0.006 | 2.16 → 2.62 | 26.5 → 24.9 / 272 |
| 5 | 11.494 → 5.182 | 1.42 → 1.42 | 0.003 → 0.003 | 2.20 → 2.40 | 18.4 → 15.9 / 208 |
| 6 | 12.483 → 4.438 | 1.85 → 1.90 | 0.002 → 0.002 | 1.58 → 1.65 | 15.2 → 12.8 / 144 |
| 7 | 13.198 → 3.852 | 1.74 → 1.75 | 0.001 → 0.001 | 0.88 → 1.02 | 16.7 → 13.5 / 96 |
| 8 | 17.476 → 3.432 | 17.50 → 19.29 | 0.005 → 0.465 | 2.59 → 2.62 | 95.0 → 87.0 / 306 |
Per-frame visible mesh counts and the largest per-LOD apply sample were:
| LOD | Visible meshes/frame p95/max, legacy → coarse | Max LOD apply/frame, legacy → coarse |
|---:|---:|---:|
| 0 | 2 / 4 → 3 / 4 | 0.762 → 0.934 ms |
| 1 | 1 / 4 → 1 / 4 | 0.630 → 0.809 ms |
| 2 | 0 / 4 → 1 / 4 | 0.533 → 0.639 ms |
| 3 | 0 / 4 → 1 / 4 | 0.515 → 0.570 ms |
| 4 | 2 / 4 → 3 / 4 | 0.605 → 1.354 ms |
| 5 | 1 / 3 → 2 / 4 | 1.272 → 0.742 ms |
| 6 | 0 / 4 → 1 / 4 | 0.687 → 0.708 ms |
| 7 | 0 / 4 → 0 / 4 | 0.974 → 0.732 ms |
| 8 | 2 / 4 → 3 / 4 | 1.625 → 1.439 ms |
The 10-task-slot slack estimate was 132.1 slot-seconds on legacy order and 73.3 on coarse-first,
computed as ten slots × (first request to full-set ready) minus measured worker-task seconds. The
shared pool averaged 3.27 / 4.21 running workers on frames with estimated pending results; one
legacy backlog frame had no running worker, versus none in the coarse-first run. Idle worker time
and apply-cap frames are shared-pool/world properties, so a per-LOD split would double-count them.
Legacy used 37.64 worker-seconds and coarse-first 39.36; pre-start worker-queue wait was only
0.067 / 0.527 tile-seconds. Result-queue wait summed to 27.41 / 28.94 tile-seconds. Game-thread
tile-apply time was about 0.24 / 0.23 seconds for the cold set. The boost run had no apply-cap or
result-backlog frames and still took 17.346 s. Thus the apply cap is not the end-to-end floor. The
remaining floor is worker-side work supply/admission; the trace does not isolate why available
worker slots stay idle or identify a safe single worker-side change for this round.
Collision is currently required only on the LOD0 path. The trace captured 60 body-update events in
each cold run; 60 of 125 collision-desired entries were ready by the full-set milestone, while
non-required/empty entries were classified separately. RealtimeMesh submit-to-body-update latency
(not isolated Chaos CPU cooking) was legacy p50/p95/max 17.02 / 17.89 / 18.04 ms, boost 16.80 /
17.51 / 17.70 ms, and coarse-first 17.08 / 18.01 / 18.30 ms. The nine required ring tiles were ready
at the gate times above. LOD1–8 had no collision-ready events in this trace.
## 3. Shared change and standalone crossing instrument
`voxel.StreamingCoarseFirst=1` now starts far-level admissions only after all nine required
walkable-ring collision gates are ready. `voxel.StreamingDynamicNearReserve=1` keeps the authored
near reserve while moving or before that gate; after a stationary gate it lets coarse work use the
reserved slots. Both are explicit, default-off controls. `voxel.StreamingStartupApplyBoost=1` allows
12 visible-mesh applies / 14 ms during the initial desired-set and walkable-ring phase, with a 30 s
ceiling; zero keeps the authored budget. It is not preemptive within one apply, so it remains opt-in.
This behavior is in shared `AVoxelWorld::UpdateChunksAroundPosition` / `ProcessPendingChunks` and
does not change density, tile output, or collision policy.
The standalone 60 m/s flight instrument now counts forward +Y chunk crossings using the actual
center delta, including multi-chunk jumps. The valid viewer route completed 250/250 center samples,
with 226 center updates and max forward delta +2. It reports `crossing_deltas=forward-+Y`,
resident 2,553/2,553 and no missing tiles. Latency still **fails**: nearest-ready p50/p95/max was
9.087 / 20.594 / 128.785 ms and maximum crossing wall time 42.931 s. The earlier
`--stream-benchmark` and `--stream-pipeline` invocations emitted no Flight markers; only the viewer
route is used for this result.
## 4. Hashes, regression checks and async audit
Standalone W1/W8/W16 fresh processes produced identical full-world and all nine per-LOD hashes;
all match S5. Full world identity: density `c10697a8f48380c7`, mesh `430d2be2bdd8b988`, payload
`b7b33e14092225c9`, topology `c5c46d66606a819e`.
- Core-off legacy at 12.5 cm: **PASS**, `VOXELFORGE_CORE_OFF_LEGACY_PASS`.
- M2 V1 and V2: **PASS**, five fixtures plus same-LOD border for each.
- SurfaceWorld and FloatingIslands BuildHost at 25 cm: **PASS**. FloatingIslands W1/W8/W16
matched Standalone; the final Standalone W1/W8/W16 matrix also matched across all nine LODs and S5.
- S4 cap census/agreement and ray coverage: **PASS**; 551 requested/emitted cap bands, 1,584/1,584
coverage rays, 128-point cap agreement max 0.0504 cm against 2 cm tolerance, negative control
detected.
- S3 ground and S4 LOD7/8 ground agreement: **PASS**; max ground delta 0.0427 cm, cross-LOD 0.0 cm,
and the negative control was detected.
- Water remains fixed for the season; player carve/fill stays unrestricted.
Diff audit: `GenerationEpoch` is carried and stale epochs are rejected; the four result queues remain
`EQueueMode::Mpsc`; `EndPlay` sets shutdown, waits for active work and drains the queues; workers
check `bShuttingDown`; `ModsLock` behavior is unchanged; all UObject/RealtimeMesh component creation
and mutation stays on the game thread. No density-sign or determinism path changed. The added C++
comments are French and English. No generated header, `Binaries/`, or `Intermediate/` source edits.
## 5. Exact commands, binaries and run ledger
BuildHost actor runs used `E:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor-Cmd.exe`
with `-nullrhi -unattended -corelimit=12 -run=VoxelForgeExplore -seed=0 -archetype=TunnelNetwork
-coreworldtest=1 -corevoxelsizecm=25 -settingsref=/Game/VoxelForge/DA_Settings.DA_Settings
-coreworldstreamtrace=1 -voxel.TestMove=1 -voxel.TestMoveSpeedCmPerSecond=600
-voxel.TestMoveStartSeconds=30 -voxel.TestMoveDirection=0,1,0
-voxel.StartupTraceUntilEndPlay=1 -voxel.CollisionGate=0`. The exact expanded `LogInit: Command Line:`
including project, DDC, trace and output paths is preserved verbatim in each [legacy run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_0_legacy_order_trace.stdout.log),
[boost run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_1_legacy_order_trace.stdout.log),
and [gated coarse run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_0_coarse_first_trace.stdout.log).
Their CVar overrides were respectively:
| Run | `StreamingCoarseFirst` | `StreamingDynamicNearReserve` | `StreamingStartupApplyBoost` |
|---|---:|---:|---:|
| Legacy negative control | 0 | 0 | 0 |
| Apply-budget A/B | 0 | 0 | 1 |
| Gated coarse-first | 1 | 1 | 0 |
Standalone 60 m/s exact command (also in [commands.txt](../../../../Saved/BuildHost/S6/standalone/commands.txt)):
```text
Standalone\bin\VoxelForgeCoreStandalone.exe --world-assembler-prototype --force-generate --workers=12 --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --test-flight-crossings=250 --flight-speed-mps=60 --process-priority=Normal --process-affinity=4095 --frame-limit=60
```
| Executable / module | SHA-256 |
|---|---|
| BuildHost `UnrealEditor-Cmd.exe` | `ECCE9996191F7F7E69B3D104EECDD0E678AE69176FDCCD79828C3E75A0654D6D` |
| BuildHost `UnrealEditor-VoxelForge.dll` | `1C083446ED360FBD798EAE4C4D3CA9E5994E906770B5017A51418BFEF46C30FA` |
| BuildHost `UnrealEditor-VoxelForgeCore.dll` | `54259552340FE81EA05640C622E9E5E5C0AC68C95F87DC718326D25EF133B2AC` |
| Standalone `VoxelForgeCoreStandalone.exe` | `1F445760AFDE264E2F28F8F2FB4CB68DBD0C8988AACD5A493B065E74C1827529` |
BuildHost UBT passed twice at 12 actions / Normal priority. `& .\Standalone\Build.ps1 -Target All
-CompileWorkers 12 -BuildPriority Normal` passed. Existing vswhere/C4838 warnings did not fail the
Standalone build. The S6 hash and 60 m/s logs are in [Saved/BuildHost/S6/standalone](../../../../Saved/BuildHost/S6/standalone/).
Failed/retried attempts, including setup failures:
- An earlier full actor attempt reached its 600 s timeout in the Standalone-reference preamble; it
left a partial trace. A first trace-only command omitted its required startup-trace output path
and exited before the actor run; the helper now makes `StreamingTraceOnly` imply trace output.
- Two fresh-shell memory preflights lacked the local `Add-Type` helper and stopped before launching
Unreal. The corrected `GlobalMemoryStatusEx` preflight ran before later launches.
- Early coarse-first attempts did not parse the requested CVar in headless `BeginPlay`; trace values
showed legacy LOD0-first order. Explicit CVar parsing fixed the A/B. An ungated coarse-first run
then delayed the walkable gate to 1.653 s; admission was changed to wait for 9/9 and rerun.
- FloatingIslands at 25 cm hit its 120 s test timeout; the bounded 600 s retry passed in 192 s.
- The first `--stream-benchmark` and `--stream-pipeline` sprint commands emitted no Flight markers.
The corrected viewer command above produced valid crossing deltas, with the latency failure
reported rather than hidden.
- Unsupported `-RunName`, a fresh-shell type reuse, and one PowerShell metric-parser expression
failed before/after measurement without changing an Unreal run. The corrected command/parser
produced the data above.
Every Unreal launch was sequential, with more than 17 GiB free memory at the final launch checks;
actor-harness peak was about 3.5 GiB and all measured processes stayed under 8 GiB. No run returned
`0xC0000142`. Crash audit found no new UECC folder; the only folder is the pre-existing
`UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000` dated 2026-09-17. Test stdout and JSONL traces
remain under `Saved/BuildHost/...`; none were copied into `Research/`.
## 6. Files and compile spots
No new C++ source file was added. Modified source files and likely compile spots:
- `Source/VoxelForge/Private/VoxelWorld.cpp`, `Source/VoxelForge/Public/VoxelWorld.h`,
`Source/VoxelForge/Private/VoxelStartupTrace.cpp`,
`Source/VoxelForge/Public/VoxelStartupTrace.h` — VoxelForge runtime module; BuildHost UBT.
- `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` — editor module; BuildHost UBT.
- `Standalone/Source/StandaloneViewer.cpp` — `Standalone/Build.ps1 -Target All`.
- `Tools/TestVoxelForgeCoreWorldHost.ps1` — harness argument/default changes; no C++ compile.
- `CODEMAP.md` §3, `ARCHITECTURE.md` §8.27, this report, and
`Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md` — documentation.
No owner file or asset was touched; no commit, push or stash was made.