Tiles with passage-overlap score >= 9 split grid fill over up to 4 helper lanes (disjoint rows, same per-sample order, join before MC) when workers are idle. FI junction tile fill 173 -> 99 ms; estimated serial floor ~0.55-0.60 s. Readiness essentially unchanged (FI/TN LOD0-2 ~2.15 s @W12): the limit is now aggregate work, not single tiles. Unreal: LOD0-2 ordered by passage overlap before travel/distance (L80 modes kept); far parents built after LOD0-1, LOD2 gated on them; helper budget via ParallelFor. Unreal null-RHI FI arrival: LOD0-2 resident at 3.65 s. All tile hashes identical to L84 (four whole views). Fast tier PASS; Linux UE host builds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
62 lines
5.4 KiB
Markdown
62 lines
5.4 KiB
Markdown
# Linux 85 — split heavy grid fills
|
||
|
||
## Split and floor
|
||
|
||
Full-resolution passage tiles with overlap score **9 or higher** can split density-grid fill over up to four helper lanes. Lanes copy the tile’s worker-local sampling caches and passage mask, write disjoint grid rows, and join before marching cubes. Each sample keeps the same evaluation order. The helper budget is limited by active tile workers under the 12-CPU affinity, so saturated W12/W16 work stays serial inside each tile.
|
||
|
||
Matched W8 profiles show the junction tile `(0,1,-93,lod0)` improved. Times are medians of three L84/L85 profiles; each tile materialized 42,875 samples.
|
||
|
||
| View | Junction service, L84 → L85 | Junction grid fill, L84 → L85 | Slowest full-grid service / fill, L84 → L85 | Estimated floor, L84 → L85 |
|
||
|---|---:|---:|---:|---:|
|
||
| FI | 243 → 167 ms | 173 → 99 ms | 243 / 173 → 224 / 167 ms | 0.560 → 0.547 s |
|
||
| TN | 168 → 159 ms | 121 → 100 ms | 243 / 172 → 246 / 186 ms | 0.593 → 0.595 s |
|
||
|
||
Floor = median base-shape time + median far-parent time + median per-run slowest full-grid LOD0 service. The junction fill fell 43% in FI and 18% in TN, but the estimated floor moved only slightly: the slowest tile can be a different, unsplit tile. Readiness also stayed close to L84 overall, with mixed W8 results and nearly unchanged FI/TN W12 results.
|
||
|
||
Cold LOD0–2-ready / whole-view seconds. L85 uses one warmup then three interleaved W8/W12 pairs per stratum; L84 values are from the L84 report.
|
||
|
||
| Stratum | L84 W8 | L85 W8 | L84 W12 | L85 W12 |
|
||
|---|---:|---:|---:|---:|
|
||
| SurfaceWorld | 1.021 / 2.209 | 0.976 / 2.166 | 0.990 / 2.081 | 0.961 / 2.019 |
|
||
| FloatingIslands | 2.264 / 3.429 | 2.286 / 3.469 | 2.180 / 3.341 | 2.162 / 3.306 |
|
||
| TunnelNetwork | 2.269 / 3.377 | 2.323 / 3.377 | 2.146 / 3.153 | 2.147 / 3.140 |
|
||
| VerticalShafts | 1.127 / 2.080 | 1.243 / 2.229 | 1.086 / 2.023 | 1.080 / 2.000 |
|
||
|
||
## Unreal and brick look
|
||
|
||
`VoxelWorld.cpp` now orders outstanding LOD0–2 tiles by passage overlap before its existing travel/distance order, while keeping L80 speed-aware modes and the collision-critical ring. Initial compile omits far parents; the Unreal scheduler builds them after desired LOD0–1 tiles are loaded and gates LOD2 until publication. The Core task adapter passes the available helper budget to Unreal `ParallelFor`.
|
||
|
||
The null-RHI FI-start trace reached 1,216/1,216 resident LOD0–2 tiles at **3.650 s**, before movement began; the center was `(3,0,-93)`. Trace: `Saved/Linux/l85/unreal-fi/fi-arrival-l85.trace.jsonl`.
|
||
|
||
Per-tile passage masks prune passage candidates at tile scope. They do not prove the sign of the complete density field inside a brick, so they do not make a cheap, sound brick skip available; no new brick audit was run.
|
||
|
||
## Hashes and checks
|
||
|
||
L84 and L85 whole-view and per-tile density, mesh, payload and topology hashes match exactly; zero tile mismatches.
|
||
|
||
| Stratum | Tiles | Density | Mesh | Payload | Topology |
|
||
|---|---:|---|---|---|---|
|
||
| SurfaceWorld | 2,850 | `40b76d0072a2adcd` | `8559df0850d4d7f1` | `7700965ff31ac702` | `0e7f2a16b4cc71a9` |
|
||
| FloatingIslands | 2,249 | `99ca213b21ce86e4` | `2977525405b79fff` | `3d7d2efb581710bd` | `af1916c949224871` |
|
||
| TunnelNetwork | 2,233 | `8d23c26f5c092be1` | `15c3aad2e29d9ea0` | `3d48f68d511c21df` | `5b1584676884edd8` |
|
||
| VerticalShafts | 2,329 | `876b44981d106be3` | `aaef57cb08bd6845` | `b19617df9f4acbb1` | `e8eee991260adff4` |
|
||
|
||
Fast tier: **PASS**, 274 checks, 286.5 s. Linux `VFHostEditor`: **PASS**, final post-timing UBT invocation used `-NoUBA -MaxParallelActions=4`, taskset CPUs 0–11, and no address-space limit. The prior full compile built 35/35 actions; three existing RealtimeMesh deprecation warnings remain. The per-tile W8 profile and timing runners used taskset and the 6 GiB address-space limit. Headless processes in hash and fast runs used both limits.
|
||
|
||
## Source files
|
||
|
||
- `Source/VoxelForge/Private/VoxelWorld.cpp` — Unreal tile ordering, far-parent deferral and helper-lane budget.
|
||
- `Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp`, `Source/VoxelForge/Public/VoxelMarchingCubesMesher.h` — parallel grid-fill hooks and worker joins.
|
||
- `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`, `Standalone/Core/src/VoxelForgeCore.cpp` — scheduler API, worker-local context and overlap scoring.
|
||
- `Standalone/Core/src/ShapeWorldInternal.h`, `Standalone/Core/src/WorldAssemblerInternal.h` — cloneable passage mask and cache-mode access.
|
||
- `Standalone/Source/StreamingWorld.h`, `Standalone/Source/StreamBenchmarkPipeline.h`, `Standalone/Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp`, `Standalone/Source/VoxelForge/Public/VoxelMarchingCubesMesher.h` — headless scheduling and split fill.
|
||
|
||
## Failed runs
|
||
|
||
- The first split smoke hit SIGBUS because helper threads wrote to their empty thread-local density buffer. Workers now write into the parent-owned grid; final hashes match.
|
||
- Splitting every passage overlap was too broad and regressed FI/TN throughput. The final score-9 threshold and active-worker budget narrow it to dense junction tiles with spare capacity.
|
||
- The first UBT attempt stopped in UnrealHeaderTool because `<cstddef>` followed the generated header include. Include order was fixed; final builds passed.
|
||
- The first fast-tier launch lacked its round-specific binary. Building the final-stamp binary fixed it; the 274-check rerun passed.
|
||
|
||
No run exceeded 30 minutes. No install, commit, push or stash was made.
|