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
214 lines
13 KiB
Markdown
214 lines
13 KiB
Markdown
# 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](captures/s9_far_horizon.jpg) (21.9 KB) | [s10_far_horizon.jpg](captures/s10_far_horizon.jpg) (18.0 KB) |
|
||
| Cap, camera 0,-35,-487.94,0,22.42 | [s9_cap.jpg](captures/s9_cap.jpg) (10.8 KB) | [s10_cap.jpg](captures/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:
|
||
|
||
~~~powershell
|
||
.\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:
|
||
|
||
~~~powershell
|
||
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:
|
||
|
||
~~~powershell
|
||
.\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:
|
||
|
||
~~~powershell
|
||
.\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:
|
||
|
||
~~~powershell
|
||
.\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.
|