Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Round14/REPORT.md
T
Fr0zkaandClaude Opus 5.5 b90d63d0f7 wip(assembler): round S10 -- LOD8 horizon sampled at MC spacing: LOD8 worker time 18.8 s -> 4.3 s
Planar far horizon samples the LOD8 interior at the MC cell spacing, keeping
128-voxel boundary strips; far recipe v3. LOD8 p95 59.8 -> 13.9 ms, spawn
worker-seconds ~41 -> 26.9, full set 7.8 -> 7.1 s, ring 0.49 s, LOD0 1.43 s,
40 m/s ring 75/75. S3/S4 2 cm agreement, 100% cap coverage, W1/W8/W12 and
W1/W8/W16 determinism pass. Report: Standalone/Research/WorldAssemblerM3/Round14.

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

13 KiB
Raw Blame History

World assembler S10 / M3 Round 14 — cheaper far ring

Date: 2026-10-19. Base: S9 / e7586a1. No commit, push or stash.

Result

The planar far path now samples the LOD8 interior at the spacing that LOD8 marching cubes can represent. At 25 cm, that is 512 voxels / 128 m per MC cell. Globally aligned 128-voxel (32 m) strips remain along tile boundaries. LOD4–LOD7 coordinates and the 2 cm agreement tolerances are unchanged. Far recipe version is 3; far mesh hashes change, while density and LOD0–LOD3 remain unchanged.

On the owner SurfaceWorld plan, the warmed eight-tile BuildHost LOD8 full-tile p95 fell 76.7%, from 59.848 ms to 13.933 ms. In the fresh 6 m/s actor spawn trace, the 2,578 initial tile jobs used 26.870 worker-seconds; the LOD8 share was 4.288 seconds. Round13’s S8 spawn reference was about 41 worker-seconds, with 18.798 seconds in its 306 LOD8 jobs. Initial readiness was 7.117 s, below the 7.7 s target. The active 3×3 walkable ring was ready in 0.490 s, and all 512 LOD0 tiles were ready at 1.428 s.

Count first — exclusive cost and duplicate columns

The counters are measured per tile. Column evaluation is timed only around uncached column work. MC, ground and cap counters subtract column time from their respective wall intervals. The mesh assembly window covers final payload flattening and optional diagnostic hashing. Each p95 is computed independently, so these p95 values are not additive.

LOD8 warmed p95, BuildHost 25 cm S9 S10 Change
Full tile 59.848 ms 13.933 ms −76.7%
Column evaluation 31.319 ms 7.478 ms −76.1%
Marching cubes 2.667 ms 2.359 ms −11.6%
Ground refinement 11.666 ms 1.690 ms −85.5%
Cap refinement 10.029 ms 1.330 ms −86.7%
Mesh assembly and diagnostic hash 5.445 ms 1.095 ms −79.9%
Column-cache misses 9,679 2,287 −76.4%

The high-cost S9 sample generated 8,192 ground triangles, removed 531 coarse ground triangles, and generated 6,732 cap triangles. S10 generated 968 ground triangles, removed 534, and generated 840 cap triangles. The geometric checks below pass at the same tolerance.

The fresh W12 Standalone overlap capture counted 153 LOD8 tiles. S10 evaluated 106,219 unique XY columns and repeated 32,738 neighboring tile evaluations, including 30,446 cross-worker repeats. The same-binary step-128 control counted 660,283 unique columns, 44,319 neighboring repeats and 41,665 cross-worker repeats. This confirms that cross-worker duplicates remain, while the coarser interior removes most column work without sharing cache state between workers.

Fresh W12 Standalone pipeline Default step 0 Negative control step 128
LOD8 worker sum 3.206 s 13.534 s
LOD8 unique XY columns 106,219 660,283
Repeated neighboring evaluations 32,738 44,319
Cross-worker neighboring repeats 30,446 41,665

Both runs used the current v3 binary. Step 128 restores S9 sampling density, but retains the v3 hash salt; its far mesh hash is therefore expected to differ from S9’s v2 hash.

BuildHost actor spawn and ring

The fresh 6 m/s trace used the S9 movement, collision and backlog settings: Legacy order, Dynamic near reserve, collision lookahead on, 256 result cap, and a 12-CPU affinity mask. Per-LOD worker generation sums for the 2,578 initial generation ordinals were:

LOD Initial tiles Worker seconds
0 512 3.840
1 448 3.781
2 320 0.811
3 272 2.093
4 272 6.688
5 208 1.535
6 144 1.988
7 96 1.846
8 306 4.288
Total 2,578 26.870

At 6 m/s, initial readiness was 7.116525 s (2,578 desired, 2,617 loaded); spawn-tick p95/max was 1.824/4.993 ms. The support ring became ready at 0.490 s (9/9). The complete LOD0 set was ready at 1.427630 s, with a 0.990836 s measured build interval. Round13’s S9 6 m/s initial-ready value was 7.813133 s.

At 40 m/s (4,000 cm/s), all 75 moving support-center arrivals from 30.205 s through 45.011 s had the full 9/9 walkable ring ready: 75/75, 100%. A stationary startup gate event before movement is excluded from that moving-center denominator. Initial readiness was 7.087272 s. Spawn-tick p95/max was 1.833/5.365 ms; the trace passed.

Quality and determinism

  • S3 ground agreement: 72 shared route points; far LOD7 and LOD8 maximum error 0.0427 cm, cross-LOD error 0 cm, within 2 cm. The 100 cm datum-offset control measured 100.0427 cm and was detected.
  • S4 cap agreement: 128 shared points; maximum error 0.0504 cm, within 2 cm. The 100 cm datum-offset control measured 100.0015 cm and was detected. Cap census emitted all 385/385 requested bands.
  • Cap coverage: 2,520/2,520 upward rays hit the cap (100%); no profile-roof, mesh or clip-edge misses.
  • Core-off legacy passed at 12.5 cm. The M2 Hybrid V1 and V2 fixture sets each passed five analytic fixtures and border checks. SurfaceWorld and FloatingIslands passed BuildHost actor validation at 25 cm. Water stayed fixed; carve and fill remained unrestricted.
  • Standalone W1/W8/W12 produced identical hashes for the full 2,553-tile view: density c10697a8f48380c7, mesh e75c9119a1498cd5, payload 49a9a8d1835a6c8c, topology edcb23288b5e8724.
  • BuildHost SurfaceWorld W1/W8/W16 matrix was stable: density 0cd2a1a4152ee4aa, mesh a06243aee16b65d5, payload c700162935c262d7, topology 0af901aa42b452bc. FloatingIslands W1/W8/W16 was stable: density 4dcfb37585d7d986, mesh f14f76fbf065c6ed, payload 53035c45fd1a082e, topology 23550100654a4ec3. W16 was a logical partition with the process still capped to 12 executing CPUs.

Far mesh hashes differ from S9 as expected under recipe version 3; current-build determinism passes.

Matched captures

All captures are 640×400 and under 22 KB. Each was produced at 60 fps with VSync on, then the Standalone viewer was closed after its back-buffer capture. Raw 1280×800 PNGs and run logs are under Saved/BuildHost/Round14/CaptureRaw/.

View S9 sampling control, 128 voxels S10 default, MC spacing
Far horizon, camera 0,-35,-487.94,0,-22 s9_far_horizon.jpg (21.9 KB) s10_far_horizon.jpg (18.0 KB)
Cap, camera 0,-35,-487.94,0,22.42 s9_cap.jpg (10.8 KB) s10_cap.jpg (10.8 KB)

The cap is low contrast in this view, as in Round8; the 2 cm agreement, triangle census and ray coverage provide the cap acceptance evidence.

Builds, commands and hashes

Builds on the final source:

.\Tools\BuildVoxelForgeCoreHost.ps1 -MaxParallelActions 12 -TimeoutSeconds 900
.\Standalone\Build.ps1 -Target All -CompileWorkers 12 -BuildPriority Normal

The fresh Standalone determinism processes used the same command with workers 1, 8 and 12:

foreach ($workers in @(1, 8, 12)) {
    .\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=$workers --world-assembler-prototype --stream-benchmark --stream-hash --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-priority=Normal --process-affinity=4095 --frame-limit=60
}

The current-build duplicate count and same-binary step-128 control used:

.\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=12 --world-assembler-prototype --stream-pipeline --stream-hash --profile-far-column-overlap --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-priority=Normal --process-affinity=4095 --frame-limit=60
.\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=12 --world-assembler-prototype --stream-pipeline --stream-hash --profile-far-column-overlap --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=128 --process-priority=Normal --process-affinity=4095 --frame-limit=60

Quality and BuildHost actor commands:

.\Standalone\bin\VoxelForgeCoreStandalone.exe --world-assembler-audit --workers=12 --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --process-priority=Normal --process-affinity=4095 --frame-limit=60
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -FloatingIslandsOnly -CoreVoxelSizeCm 25 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreOffTest -CoreVoxelSizeCm 12.5 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -HybridFixturesOnly -CoreMesherRecipe WorldAssemblerHybridV1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -HybridFixturesOnly -CoreMesherRecipe WorldAssemblerHybridV2 -CoreVoxelSizeCm 25 -TimeoutSeconds 900

The two fresh actor traces differed only in speed, 600 or 4,000 cm/s:

.\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 600 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 4000 -TimeoutSeconds 900

Final binary SHA-256:

Binary SHA-256
BuildHost UnrealEditor-VoxelForgeCore.dll D87CC56BACCDE6559705EEAEA7DB73D1A6ABF79484D37A3887B94A9FD62BABD3
BuildHost UnrealEditor-VoxelForge.dll 9D0522ECC9A6AC52D9F3ACC2FD44399FE70F557C5F11D0203AB4C4B8EE75C198
BuildHost UnrealEditor-VoxelForgeEditor.dll AA196DA5A6DB3C84B5EC4F002AEBC787386DBB8F2798F5D1EEC03010BF642BBA
Standalone VoxelForgeCoreStandalone.exe E316D7E3E0B3D3639DAE61D6E2D1091F38C59A210B3B7DD8124928D21A8119A5

Run notes, files and safety review

  • BuildHost and Standalone ran at Normal priority with no more than 12 executing CPUs; free memory was above 17 GB before the final launches. BuildHost peak private memory was 3.76 GiB for SurfaceWorld, 3.27 GiB for FloatingIslands, 3.39 GiB for the 6 m/s trace and 3.67 GiB for the 40 m/s trace. The Standalone overlap/control processes peaked below 0.72 GiB. No process exceeded 8 GiB, and no launch overlapped another Unreal/Standalone process.
  • Standalone’s first compile attempt failed in StandaloneViewer.cpp because one helper referred to App outside its scope; that reference was corrected and the final build passed. The existing vswhere.exe lookup warning and VoxelStrateManager.cpp C4838 warnings remained.
  • Three BuildHost CVar attempts (direct argument and two ExecCmds forms) read back zero and did not change the worker grid; that no-op CVar/harness path was removed. An early Standalone step-128 attempt also did not reach the pipeline; CLI pass-through was corrected and the final same-binary step-128 control above is effective. No CVar remains in the final source.
  • One high-pitch cap capture was black and was discarded. A separate early capture shell lacked its memory-probe type because the PowerShell session was fresh; that capture completed without a pre-launch memory gate. The matched final captures were rerun with the gate active. No 0xC0000142 occurred and no run needed retrying.
  • The only UECC directory was the pre-existing UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000, timestamped 2026-09-17; no new UECC folder was created.
  • No new source files. Changed source files and compile spots:
File Compile spot
Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h, Standalone/Core/src/VoxelForgeCore.cpp, Standalone/Core/src/WorldAssemblerInternal.h VoxelForgeCore in Standalone and BuildHost
Standalone/Source/StreamingWorld.h, Standalone/Source/StandaloneViewer.cpp StandaloneViewer / VoxelForgeCoreStandalone.exe
Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp BuildHost VoxelForgeEditor module
Tools/TestVoxelForgeCoreWorldHost.ps1 PowerShell harness only; recipe-specific fixture logs

Async-safety review: no actor async source changed. Epoch checks, MPSC queues, EndPlay draining, worker bShuttingDown checks and ModsLock remain unchanged. Region-page publication, shared_ptr lifetime and concurrent eviction remain unchanged. New duplicate capture stays thread-local and is copied into the tile result; its worker-id hash is diagnostic only. UObject and RealtimeMeshComponent mutation remain on the game thread. No owner .uproject, editor, .uasset, or RealtimeMeshComponent file was modified. git diff --check passed. No commit, push or stash.

Dialogue

User: Keep the 12-thread cap; count exclusive LOD8 costs first, optimize the planar far path, and verify quality and determinism.

Codex: The LOD8 interior now follows the MC spacing, with 128-voxel boundary strips preserved. The owner-plan LOD8 p95 fell from 59.848 ms to 13.933 ms; cap and ground gates, both BuildHost actor matrices, current-build worker hashes, and the 40 m/s support ring passed.