voxel.StreamingCollisionLookahead (default on) predicts the support tile 350 ms ahead along full 3D velocity and prioritises its 9-tile collision ring. Owner plan, BuildHost actor: 40 m/s arrival-ready 25/74 -> 74/74 (CVar-off control 15/74); 6/12/25 m/s stay 100%; -Z 50 m/s 93/93. Spawn unchanged (~7.7 s). Critical LOD0 path at 40 m/s: generation 67 ms p50, RMC body update 38 ms p50. LOD8 cost counted (native horizon 48 ms of 60), optimisation deferred. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
15 KiB
World assembler S9 / M3 Round 13 — support-ring lookahead
Result: the support ring is ready at all tested center arrivals through 40 m/s horizontally, and through a scripted 50 m/s vertical descent. At 40 m/s the matched CVar-off control reached the ring at only 15/74 arrivals; lookahead reached it at 74/74. Initial readiness was 7.743 s with lookahead and 7.778 s without it. I did not reserve more workers, and I left the LOD8 geometry unchanged; its counted optimization plan is in §5.
The lookahead is default-on through voxel.StreamingCollisionLookahead=1; 0 disables prediction.
It follows the support tile, predicts 350 ms ahead (rounded up to one or two 8 m LOD0 tiles at the
25 cm owner scale), and promotes only rings already inside the desired clipmap. I first predicted
from the stream center. The trace showed that this was one tile above the walkable center on this
SurfaceWorld plan. I corrected both scheduler branches to predict and prioritize from
GetPlayerSupportTile. No field or mesh arithmetic changed, so the recipe versions remain as-is.
1. Speed sweep
Fresh BuildHost commandlets used the staged owner SurfaceWorld plan, seed 0, 25 cm Core scale,
Legacy streaming order, Dynamic near reserve, apply boost 0, region concurrent admission 1, result
backlog cap 256, Normal process priority, a 12-action host limit, and movement from 30 to 45 s.
The S8 traces are the pre-lookahead baseline. Arrival readiness is the walkable_gate.ready value
on the support-center-change event. Lag is the maximum time to a later 9/9 sample before the next
support-center change; unresolved centers are counted separately. LOD0 missing is the number of
scheduler_admission samples with any desired LOD0 key missing during 30–45 s.
| Motion | S8 arrival-ready | S8 worst resolved lag / unresolved | S8 LOD0-missing frames | S9 arrival-ready | S9 worst lag / unresolved | S9 LOD0-missing frames |
|---|---|---|---|---|---|---|
| +Y 6 m/s | 11/11 (100%) | 0 ms / 0 | 168/838 (20.0%) | 11/11 (100%) | 0 ms / 0 | 165/839 (19.7%) |
| +Y 12 m/s | 22/22 (100%) | 0 ms / 0 | 431/776 (55.5%) | 22/22 (100%) | 0 ms / 0 | 436/775 (56.3%) |
| +Y 25 m/s | 46/46 (100%) | 0 ms / 0 | 625/677 (92.3%) | 46/46 (100%) | 0 ms / 0 | 627/679 (92.3%) |
| +Y 40 m/s | 25/74 (33.8%) | 191.1 ms / 8 | 579/595 (97.3%) | 74/74 (100%) | 0 ms / 0 | 576/593 (97.1%) |
| −Z 50 m/s | — | — | — | 93/93 (100%) | 0 ms / 0 | 605/626 (96.6%) |
The matched 40 m/s CVar-negative control on the corrected source reached 15/74 centers (20.3%), with 196.3 ms worst resolved lag, 7 unresolved centers, and 574/590 LOD0-missing samples (97.3%). This isolates prediction from the support-center correction. The old S8 60 m/s + 400 m teleport remains a separate discontinuity case: 8/113 centers were ready at arrival, 3 more became ready before the next center, and 102/113 never reached 9/9.
At 40 m/s the current run therefore supports 40 m/s as the highest tested horizontal speed; it does not establish a higher horizontal ceiling. The 50 m/s trace used the harness's scripted downward actor movement through the staged owner plan, not a Chaos free-fall simulation in a shaft. The ring remained ready through all 93 center changes.
Spawn did not regress in the matched 40 m/s pair: initial_ready_s was 7.743349 s on and 7.777605 s
off, with spawn-tick p95 2.288 ms and 2.292 ms respectively. The S9 on-run initial-ready values
at 6/12/25/40 m/s were 7.813133/7.815265/7.821660/7.743349 s. Movement begins at 30 s, and the
lookahead adds no stationary-spawn requests.
2. Critical path at 40 m/s
For 108 traced critical LOD0 jobs with complete tile-event joins, p50/p95 were:
| Stage | p50 | p95 |
|---|---|---|
| Request → worker start | 0.02 ms | 9.59 ms |
| Worker generation | 66.6 ms | 84.0 ms |
| Result queue → game-thread apply | 9.3 ms | 17.7 ms |
| Game-thread apply → mesh submit | 0.17 ms | 0.24 ms |
| Mesh → collision submit | 0.01 ms | 0.02 ms |
| RMC submit → body-update event | 37.6 ms | 85.9 ms |
The body-update interval is the observable collision-ready delay; it is not an isolated Chaos CPU cook timer. Generation and body update dominate. Request-to-worker delay is small at the median, and game-thread apply/submission is below a quarter millisecond at p95. The lookahead gives the generation and body-update stages time to finish before support-center arrival.
At 40 m/s the trace reported two lookahead tiles and three newly collision-promoted keys per scheduler rebuild, with zero desired keys outside the clipmap. Worker occupancy hit the 10-task limit, while the result queue peaked at 113 entries / 16.8 MB under the 256 cap and recorded no cap stops. Region compile time was 1.74 ms p50, 22.16 ms p95, 33.32 ms max; concurrent admission recorded no global scheduler skips. Those systems still consume time, but the matched CVar test shows prediction is sufficient at this plan's 40 m/s horizontal limit without adding reserved slots.
3. Output quality and determinism
- BuildHost Core-off legacy passed at 12.5 cm. M2 HybridV1 and HybridV2 each passed five analytic fixtures plus border checks at 25 cm.
- SurfaceWorld passed at 25 cm with collision, anchor movement, carve and travel checks. Its
W1/W8/W16 actor hash matrix was stable: density
0cd2a1a4152ee4aa, mesh80a5b054b904b1a2, payloadbf2f1b40dff38acc, topology56074198682d5e18. Peak commandlet private memory was 3.90 GB. - FloatingIslands passed at 25 cm with fixed water, edits, collision and LOD0/1 coverage; the BuildHost actor matrix reported W1/W8/W16. Peak private memory was 3.25 GB.
- The current Standalone W1/W8/W12 full-clipmap and per-LOD 0–8 density, mesh, payload and topology
hashes match. Full-clipmap hash tuple: density
c10697a8f48380c7, mesh430d2be2bdd8b988, payloadb7b33e14092225c9, topologyc5c46d66606a819e. Full-detail hashes also match. - The Standalone S4 audit passed: 385/385 far-cap bands, 128 agreement points (maximum 0.0504 cm under the 2 cm gate), the 100 cm offset negative control, and 2,520/2,520 cap-coverage rays. The current BuildHost SurfaceWorld S3 check passed 128 points with 0.0427 cm maximum far/near error and detected its 100 cm offset control.
- A sampled Standalone W12 benchmark process peaked at 0.68 GB private memory.
I did not run Standalone --workers=16: that implementation constructs 16 worker threads,
which conflicts with the explicit 12-thread launch cap. Current Standalone W1/W8/W12 match, and
the BuildHost SurfaceWorld and FloatingIslands W1/W8/W16 matrices passed. I requested whether the
owner wants a one-run W16 exception; until then the 12-thread cap stands. No new UECC-* folder
was present; the only folder was the existing 2026-09-17 crash.
No geometry, field, density or recipe output changed. The far-horizon recipe stays at v2 and the SurfaceWorld plan identity stays unchanged. Water remains fixed for the season; player carve/fill remains unrestricted.
4. Goal 2 — counted LOD8 plan, optimization deferred
The S8 cold owner trace measured 306 LOD8 jobs at 18.798 worker-seconds total (61.4 ms average, 79.8 ms p95, 94.7 ms max), 45.6% of worker time. Its full set reached readiness in about 7.7 s. The current 25 cm BuildHost feature-cost probe warmed eight LOD8 keys and reported p95 per-tile diagnostics: full/candidate feature path 59.508/59.585 ms, column computation 30.771 ms, marching cubes 6.018 ms, native ground+cap horizon refinement 48.205 ms, classification 0.0046 ms, feature list 0.0007 ms, and shell work 0.0001 ms (repair skipped). The profile counters are overlapping inclusive measurements, so they must not be summed. The same probe reported 15,529 field calls, 9,679 column-cache misses, 8,192 refined ground triangles, 531 ground triangles removed, and 6,732 cap triangles at the sampled high-cost LOD8 tile.
HeightfieldColumnCache is a 65,536-entry thread-local cache keyed by global XY. It reuses columns
within a worker, but does not share cache entries across workers. The current probe does not count
cross-tile duplicate samples by worker, and does not split ground-refinement time from cap-refinement
time. The next measurement should add exclusive counters for column evaluation, MC, ground refine,
cap refine, classification, and cache hits/misses per tile and worker, then trace duplicate global
columns across neighboring LOD8 jobs.
No LOD8 optimization or far-mesh change was made this round, so no before/after far-horizon/cap captures were produced and the below-7.7 s Goal 2 target remains open. The counted next step is to prototype shared immutable heightfield-column pages for planar families, compare against sampling at displayed resolution and tolerance-based refinement skips, then rerun S3 ground/S4 cap gates (2 cm agreement, 100% coverage) and matched viewer captures at VSync/60 fps, closing the viewer right after each capture. Do not relax tolerances without a metre-scale error bound.
5. Builds, commands, binaries and run record
BuildHost and Standalone builds passed on their first attempt. Standalone build printed the existing
vswhere.exe lookup warning and C4838 conversions in VoxelStrateManager.cpp:3974–3975, then
built both targets successfully. All commandlets were fresh, serial, Normal priority and below
8 GB; the largest sampled BuildHost private memory was 3.90 GB. No process exceeded the 15-minute
step limit.
Build commands:
.\Tools\BuildVoxelForgeCoreHost.ps1 -MaxParallelActions 12 -TimeoutSeconds 900
.\Standalone\Build.ps1 -Target All -CompileWorkers 12 -BuildPriority Normal
The final horizontal trace command (repeat with speeds 600, 1200, 2500, and 4000 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
The pre-S9 baseline used the same staged plan and settings with the S8 binary, before the lookahead CVar existed; repeat with the same four speed values:
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 600 -TimeoutSeconds 900
Vertical descent and the matched 40 m/s CVar-negative control:
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,0,-1' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 5000 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 0 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 4000 -TimeoutSeconds 900
Quality commands:
.\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
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900
.\Tools\TestVoxelForgeCoreWorldHost.ps1 -FloatingIslandsOnly -CoreVoxelSizeCm 25 -TimeoutSeconds 900
.\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
Standalone determinism command template (fresh process, --workers=1, 8, and 12; 16 was
not launched under the thread cap):
.\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=1 --world-assembler-prototype --stream-benchmark --stream-hash --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --process-priority=Normal --process-affinity=4095 --frame-limit=60
One initial CVar-off command was rejected by PowerShell before launch because the movement vector
was not quoted (Cannot convert value to type System.String). I retried with
-TestMoveDirection '0,1,0'; the BuildHost run passed. No Unreal process launched for the rejected
attempt. No other test/build attempt failed or retried.
Binary SHA-256:
| Binary | SHA-256 |
|---|---|
UE 5.7 UnrealEditor-Cmd.exe |
ECCE9996191F7F7E69B3D104EECDD0E678AE69176FDCCD79828C3E75A0654D6D |
S8 baseline BuildHost UnrealEditor-VoxelForge.dll |
8B82EE6C6FBB511AE766EB3D8646A7E9491952F41445CB62D49D71D0B9783418 |
S8 baseline BuildHost UnrealEditor-VoxelForgeEditor.dll |
B3BC5E61172C5B21D928A5ACB5F22F8D9E00179B481B675804838DE9A620010D |
BuildHost UnrealEditor-VoxelForge.dll |
F542FC1F014190798485CC088470FD498D368D2E369639EAD32A0EEE8FDB1193 |
BuildHost UnrealEditor-VoxelForgeCore.dll |
0A1EB7BB27C3C74A4AA0996E0A24E74224D7B8FFFFF113B1071FA42E18E8375A |
BuildHost UnrealEditor-VoxelForgeEditor.dll |
15B6460FD4E48D14CBE751C99447F06B62B44CF35FFD440AED106585AECEDC79 |
Standalone/bin/VoxelForgeCoreStandalone.exe |
FD4CD39CD49BB0E8429250295BD16FACA0A6FBE412240522AB79C086245978C0 |
Trace JSONL and actor stdout remain under
Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/. The initial
lookahead results are retained in Saved/BuildHost/Round13/BeforeSupportTileCorrection/; Standalone
hash logs and the S4 audit log are under Saved/BuildHost/Round13/. No file over 300 KB was added
outside Saved/BuildHost/. No .uproject, editor, .uasset, RealtimeMeshComponent source, commit,
push or stash was touched.
Modified source files:
Source/VoxelForge/Private/VoxelWorld.cpp— CVar, support-centered lookahead and critical ring ordering; BuildHostVoxelForgeruntime compile.Source/VoxelForge/Public/VoxelWorld.h— private helper declarations; same runtime compile.Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp— movement-vector harness; BuildHostVoxelForgeEditorcompile.Tools/TestVoxelForgeCoreWorldHost.ps1— movement-vector and CVar arguments.
New source files: none. Standalone source files were not changed. Documentation updated:
CODEMAP.md §3.16 and ARCHITECTURE.md §8.30.
Async-safety diff review: Epoch propagation/checks are untouched; all result queues remain
EQueueMode::Mpsc; EndPlay still drains after active tasks finish; workers still check
bShuttingDown; ModsLock and immutable region-page lifetime are unchanged; UObject and RMC
mutation remain on the game thread.
Dialogue
User: Continue S9 from the 6 and 12 m/s lookahead traces after the service interruption.
Luna: Resumed at the 25 m/s run, found and fixed the support/stream-center mismatch, then measured the corrected speed sweep and matched 40 m/s CVar control.