Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux72/REPORT.md
T
Fr0zkaandClaude Opus 5.5 d970d75be8 streaming: deeper ready queue + startup apply cap; tile-local mouth-support culling (L72)
- Unreal: ready queue depth 8 -> 16 (cap 4 worker-sets / 64), startup mesh-apply cap
  12 -> 24 within the unchanged 14 ms budget. Owner SW arrival, same 2,850 keys:
  initial set ready 4.78 -> 3.74 s, queue p95 123 -> 35 ms, request-to-apply p95
  139 -> 45 ms; walkable gate 1.07 -> 1.11 s; per-frame apply p95 0.73 ms.
- Core composer: mouth-support segments filtered by tile bounds, mouth relief result reused
  (route checks -80/-87% in passage tiles). Hashes identical W1/W8/W12, Clang and GCC.
- Opt-in per-tile composer counters. Verify control meshes stored as .xz (78.5 -> 18.4 MB).
- Fast tier 269 PASS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
2026-10-27 08:25:14 +01:00

5.2 KiB
Raw Blame History

Linux 72 report

Unreal timeline

Three L71 and three L72 traces used the same 2,850 tile keys. The readback value streaming_background_worker_cap=1 selects the TaskGraph background lane; Unreal reported eight background workers and eight effective tile slots. The delay was queue admission and result draining, not RMC construction. Raising ready queue depth from 8 to 16 and the startup apply count cap from 12 to 24 moved readiness forward. The hard game-thread apply budget stays 14 ms, and the moving-player admission cap still prevents a ready backlog during fast travel.

Median milestone L71 L72
Last tile requested 4.577 s 3.680 s
Last worker started 4.583 s 3.696 s
Last worker finished 4.597 s 3.712 s
Last tile applied 4.754 s 3.724 s
Initial set ready 4.775 s 3.741 s
Walkable gate ready 1.068 s 1.107 s
Queue p95 122.7 ms 34.8 ms
Request-to-apply p95 139.1 ms 45.3 ms

The worker-finish-to-last-apply tail fell from 157 ms to 11 ms. L72 per-frame apply work was p95 0.73 ms, max 6.26 ms, below the 14 ms cap; the cap was not hit. Commandlet frame interval p95 was 18.85 ms. Initial-set readiness still takes 3.74 s (about 199 p95 frame intervals), so the roughly 1 s target is not met. Against the 2.41 s headless stride-0 whole-view median, about 1.33 s remains in the Unreal path. RMC build p95 was 0.32 ms.

Headless whole-view timing used three interleaved before/after pairs per stratum:

Stratum Tiles Before median After median
0 2,850 2.538 s 2.412 s
1 2,249 6.382 s 6.343 s
2 2,233 5.718 s 5.443 s
3 2,329 2.661 s 2.624 s

Passage composer

The L71 40× compares 18.8 ms for nonempty passage tiles with 0.5 ms across all LOD0 tiles; 441 of 512 LOD0 tiles were empty. Empty tiles can stop after classification, while a nonempty passage tile fills and meshes a density grid. It is not a matched per-sample comparison. These profiles do not isolate the passage-specific share of total tile time: passage controls have about twice the samples of the terrain control, and no matched nonempty terrain control was profiled. Native calls were 27,367 for terrain (17,680 samples) and 43,243/44,767 for passage tiles (36,439/37,975 samples).

Within the composer, route-mouth checks were a large avoidable scan. The shared composer now filters mouth-support segments against per-tile bounds and reuses the identical mouth relief result. Passage carve/support visits and smoothstep counts stayed the same. The exact counters are below; they show reduced work, but do not identify the dominant timed composer term.

Tile (LOD0) Samples Native calls before/after Mouth route checks before → after Relief calls before → after
Terrain (5,-2,-47) 17,680 27,367 — —
Passage (1,0,-47) 36,439 43,243 612,242 → 123,090 384,444 → 343,414
Passage (0,1,-47) 37,975 44,767 1,042,612 → 131,334 407,910 → 364,554

Field calls and world hashes are unchanged. The two passage samples reduced route checks by 80% and 87%. A single instrumented worker-time comparison was mixed (100.0→91.8 ms and 155.2→157.1 ms), so it does not establish a stable per-tile wall-time gain. L71 identified near-field density-grid sampling and meshing as the largest cost; L72 does not isolate which composer term takes the most time.

Integrity and housekeeping

  • Hashes matched before/after at W1, W8, and W12 with Clang and GCC: all 2,850 keys and density, mesh, payload, and topology hashes matched.
  • Fast tier passed in 270.2 s (269 PASS, 5 DIAGNOSTIC); gates and thresholds are unchanged.
  • Compressed all 11 verification meshes with Python lzma: 78.54 MB → 18.37 MB (23.4% of original). verify.py expands them into its output baselines folder before use.

Source changes

  • Source/VoxelForge/Private/VoxelWorld.cpp: queue depth and startup apply count tuning, retaining the 14 ms hard budget and moving-player admission behavior.
  • Standalone/Core/src/ShapeWorldInternal.h: tile-local passage support segment filtering and reused mouth relief evaluation.
  • Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h, Standalone/Core/src/VoxelForgeCore.cpp, Standalone/Source/StreamingWorld.h, Standalone/Source/StreamBenchmarkPipeline.h, Standalone/Source/StreamBenchmarkHeadless.cpp: opt-in per-tile composer counters.
  • Standalone/Tools/verify/verify.py and the Linux37/Linux47 audit scripts: decompressed baseline path handling.

Failed and rejected runs

  • The first Unreal build referenced unavailable .NET 8.0.300; retry with installed 8.0.412 succeeded.
  • An initial hash invocation omitted --stream-hash-tiles and emitted no hash rows; corrected six-config matrix passed.
  • The first fast-tier attempt lacked built executables, then an audit helper still read the compressed baseline path. Both were corrected; the rerun passed.
  • A no-feature passage cull changed density hashes in 433 tiles and was reverted. A point-bound trial rejected no negative LOD0 samples, and a carve-seed trial added one candidate visit per query; both were dropped. A depth-32 queue probe worsened LOD0 request-to-apply p95 (102.6 ms) and walkable readiness (1.204 s), so depth 16 was retained.