wip(assembler): round S9 -- collision look-ahead: ground ring ready on arrival up to 40 m/s and 50 m/s falls
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
This commit is contained in:
1 parent
8440adc742
commit
e7586a1256
7 files changed
+507
-70
No files matched your search
@@ -0,0 +1,226 @@
|
||||
# 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`, mesh `80a5b054b904b1a2`,
|
||||
payload `bf2f1b40dff38acc`, topology `56074198682d5e18`. 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`, mesh `430d2be2bdd8b988`,
|
||||
payload `b7b33e14092225c9`, topology `c5c46d66606a819e`. 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:
|
||||
|
||||
```powershell
|
||||
.\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):
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
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:
|
||||
|
||||
```powershell
|
||||
.\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:
|
||||
|
||||
```powershell
|
||||
.\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:
|
||||
|
||||
```powershell
|
||||
.\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):
|
||||
|
||||
```powershell
|
||||
.\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; BuildHost `VoxelForge` runtime compile.
|
||||
- `Source/VoxelForge/Public/VoxelWorld.h` — private helper declarations; same runtime compile.
|
||||
- `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` — movement-vector harness; BuildHost `VoxelForgeEditor` compile.
|
||||
- `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.
|
||||
Reference in new issue
Block a user