standalone: speed round closed -- full-payload whole view 2.16 s @8 workers; UV/colour/groups cost 0.62 s

Takeover after the PC reset. Verified at 1 and 8 workers: density, geometry, full payload and
topology hashes equal for all nine outputs; routes 5642/5642; crater transaction 17 ms; player
neighbourhood mesh-ready 23 ms after streaming starts.
- The plugin's materials consume UV, the packed biome/slope/blend colours and the ceiling/ground
  sections, so the viewer-only skips stay off by default (diagnostic only: 1.53 s without them).
- UVs staged as FVector2f (matches the game stream; -20 MB, no speed change). Far-bin reserve 24x.
- LOD6 is the long pole: 32.7 M density samples, 1.83 M vertices, ~1.1 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-04 13:27:03 +02:00
1 parent ee5b05b357
commit 6ec4a8f856
10 files changed
+417 -166

No files matched your search

@@ -1,141 +1,166 @@
# Shape world speed round
# Shape world speed round — final half-load verification
## Result
The one-second whole-view goal does **not** pass. On the final rebuilt source, cold process-start to all 6,498 tiles through LOD6 took 1.958 s at 8 workers and 1.629 s at 16. The measured shape build plus uncached mesh generation took 1.805 s / 1.454 s. LOD6 remains the largest single streaming stage. The full-detail 960-tile area took 0.896 s / 0.703 s for shape build plus mesh generation; process-start to completion was 1.057 s / 0.825 s. Collision cooking and GPU upload are not measured by this CPU harness.
The whole-view target remains unmet. The cold, uncached, full-payload view generated all 6,498 tiles through LOD6 in 2.135 s and 2.174 s at 8 workers. The mean process-start-to-ready time is 2.155 s. Shape compilation plus full-payload meshing averaged 1.945 s, so the generation path is about 0.945 s over the one-second mark; the process-start headline is 1.155 s over. Hashing was disabled for those timing runs. Collision cooking and the plugin’s GPU upload are not included.
Implementation: [shape compiler and field](../../../Source/StandaloneShapeWorld.h), [streaming/edit benchmark](../../../Source/StreamingWorld.h), [viewer measurements](../../../Source/StandaloneViewer.cpp), and [machine runner](RunMachine.ps1).
The final source and measurements are in [StandaloneShapeWorld.h](../../../Source/StandaloneShapeWorld.h), [StreamingWorld.h](../../../Source/StreamingWorld.h), [StandaloneViewer.cpp](../../../Source/StandaloneViewer.cpp), [Build.ps1](../../../Build.ps1), and this report. The six current captures are linked below.
| Cold job | Workers | Shape build | Uncached mesh | Shape + mesh | Process start → completion | Cache hits |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 64 m full-detail area, 960 tiles | 8 | 0.725 s | 0.171 s | **0.896 s** | **1.057 s** | 0 |
| 64 m full-detail area, 960 tiles | 16 | 0.549 s | 0.154 s | **0.703 s** | **0.825 s** | 0 |
| Whole view, 6,498 tiles through LOD6 | 8 | 0.844 s | 0.961 s | **1.805 s** | **1.958 s** | 0 |
| Whole view, 6,498 tiles through LOD6 | 16 | 0.672 s | 0.782 s | **1.454 s** | **1.629 s** | 0 |
## Machine rule and headline timings
The first four stage columns use separate cold, no-cache processes. Process-start timing begins immediately before `Start-Process`, includes executable launch and world setup, and ends after the final tile is meshed; it still excludes interactive GPU upload and collision cooking. The worker runner is Normal priority on affinity `0xFFFF` and polls at 50 ms. Peak private memory was 0.41 / 0.47 GiB for whole-view 8 / 16-worker runs.
All builds and benchmark processes in this continuation ran at BelowNormal priority with affinity 0xFF00. Builds use /MP8. The final headline uses 8 workers, full UV/color/group payload, no mesh cache, and two no-hash cold runs. No current 16-worker timing was run after the reset.
The 3×3×3 LOD0 neighborhood completed in 18 ms / 19 ms after streaming started. The whole 960-tile full-detail run took 1.057 s / 0.825 s from process start, so at 16 workers even the full-detail area was ready inside one second. The standalone harness does not cook collision, so the required collidable-ready time remains unverified.
The edit probe submits a 10 m sphere crater, a rounded-box cut, and a capsule rim as one field transaction, centered 24 m from the player across the LOD0/LOD1 seam. One remesh batch completed all 14 intersecting tiles: 12 at LOD0 and 2 at LOD1. Remesh wall time was 12 ms / 13 ms and edit-request-to-ready was 15 ms / 18 ms at 8 / 16 workers, with zero cache hits. This CPU harness does not update an interactive GPU scene or cook collision.
## Profile and before/after timings
The baseline is the first cold, profiled source at the start of this speed round (`profile_whole_view_w8/w16`). “After” uses the final selected source (`restored_final_whole_w8/w16`). Timings vary by a few milliseconds between cold runs; the table uses one no-hash run at each worker count.
| Whole-view stage | Before, 8 | After, 8 | Before, 16 | After, 16 |
| --- | ---: | ---: | ---: | ---: |
| Local shapes and line bins | 57.6 ms | 54.6 ms | 57.7 ms | 54.2 ms |
| Rock intervals, packed signs, candidate axes and mask merge | 132.6 ms | 123.8 ms | 126.7 ms | 114.0 ms |
| Surface detail band | 539.0 ms | 537.3 ms | 395.1 ms | 375.2 ms |
| Far parent shapes and spatial bins | 194.7 ms | 120.4 ms | 191.6 ms | 121.1 ms |
| **Shape build** | **932.3 ms** | **843.5 ms** | **779.7 ms** | **672.1 ms** |
| **All LOD mesh generation** | **1,064 ms** | **961 ms** | **850 ms** | **782 ms** |
| **Shape build + mesh** | **1.996 s** | **1.805 s** | **1.630 s** | **1.454 s** |
At 16 workers the final interval subprofile was: local primitives and line bins 54 ms, rock interval/sign lines 20 ms, candidate-axis lines 55 ms, candidate-mask merge 25 ms (about 4 ms serial remainder), surface detail 375 ms, far-parent generation 76 ms, and far spatial-bin construction 45 ms. The 138,188,413-node field used 36.71 MiB of packed words, 55.06 MiB of candidate-axis words, a 131.79 MiB surface proxy, and 72.78 MiB of primitive storage. The far spatial index has 328,944 bins and 1,428,924 primitive references. Its compact bin lists hold up to four IDs inline in 181,237 bins; 147,707 larger bins spill to a small heap array. Whole-view processes peaked at 0.41 / 0.48 GiB private memory at 8 / 16 workers.
Per-LOD completion time is measured from stream start and is cumulative, not a sum of LOD durations:
| LOD | Tiles | Density samples | Before complete, 8 / 16 | After complete, 8 / 16 |
| ---: | ---: | ---: | ---: | ---: |
| 0 | 512 | 21.952 M | 0.107 / 0.092 s | 0.130 / 0.102 s |
| 1 | 448 | 19.208 M | 0.190 / 0.153 s | 0.210 / 0.161 s |
| 2 | 320 | 2.195 M | 0.221 / 0.178 s | 0.233 / 0.178 s |
| 3 | 208 | 1.427 M | 0.244 / 0.196 s | 0.251 / 0.194 s |
| 4 | 144 | 0.988 M | 0.255 / 0.205 s | 0.261 / 0.200 s |
| 5 | 96 | 0.658 M | 0.264 / 0.211 s | 0.268 / 0.206 s |
| 6 | 4,770 | 32.717 M | 1.061 / 0.836 s | 0.948 / 0.778 s |
LOD6 emits 1,795,216 vertices, 10,047,528 indices, and 79.42 MiB of CPU mesh data. It starts at about 0.25 / 0.21 s and finishes at 0.948 / 0.778 s at 8 / 16 workers; while active it keeps the worker pool busy. Whole-stream worker-idle estimates were 1.7% / 1.4%. It is the main mesh bottleneck.
A sequential profile of 32 nearby LOD6 tiles measured 33.1 ms total: density-grid evaluation 14.3 ms, cell classification 2.6 ms, gradients 0.3 ms, edge interpolation 0.3 ms, triangle/vertex emission 12.9 ms, and other mesher work 0.5 ms. This sample diagnoses the per-tile stages; it is not a replacement for the full parallel whole-view timing. Density evaluation and output emission remain similarly expensive.
## Changes and research decisions
- `EffectiveRockDistance` now uses one spatial-bin lookup and evaluates cave and solid-overlay distances in the same primitive pass. Lattice semantics and floating-point result ordering were kept. The two full-clipmap hashes stayed bit-identical.
- Candidate masks from the three interval axes are merged in parallel by line, using atomic OR on disjoint output words. The candidate set did not change; this reduced the interval/sign stage by about 13 ms at 8 workers and 10 ms at 16 in these runs.
- The post-interval far build no longer rebuilds axis-line indices that only the already-finished interval solver uses. Reserving the far spatial hash map from the measured primitive count reduced the original far-bin stage from about 112 ms to 97 ms. Replacing per-bin vectors with a 24-byte four-ID inline/spill list then reduced the measured 16-worker far-bin construction to 45 ms. Primitive IDs are still appended in ascending order, which preserves each bin's field-query order.
- The inline-list build had 328,944 far bins: 181,237 fit up to four IDs inline and 147,707 spill to heap storage. Across the full stream, density and CPU mesh hashes remained unchanged. The mesher now also reserves its existing per-worker vertex map from `2 × cells²`; the 32-tile LOD6 attribution sample moved from 33.513 ms to 33.145 ms. The whole-view difference is small and within run variation, so this reserve is retained as a low-cost allocation hint rather than claimed as a major speedup.
- Research: [Abseil's Swiss-table design notes](https://abseil.io/about/design/swisstables) and Meta's [F14 hash-table write-up](https://engineering.fb.com/2019/04/25/developer-tools/f14/) describe how inline storage and cache-aware lookup can reduce pointer chasing and allocation overhead. That motivated two prototypes. A flat open-addressed spatial index cut 16-worker bin construction from about 45 ms to 33 ms, but increased the measured streaming stage from about 761 ms to 804 ms; shape plus mesh was 1.471 s versus 1.440 s with the compact inline-bin hash map. I rejected the flat index because the query cost erased its build-time win. A first inline-list layout with a separate vector enlarged every map node and also streamed slower; the retained 24-byte union layout avoids that metadata growth.
- Added per-stage/per-LOD timing and worker accounting, a 27-tile neighborhood-ready metric, and a filtered one-queue edit-batch benchmark. The edit brush SDF uses explicit SSE2 square root instructions, with `/fp:precise` and `/arch:AVX2`; it does not add CRT transcendental calls or FMA contraction.
- A thread-local last-bin cache was tried and rejected: hashes matched but the LOD6 run showed no stable speed gain. A parallel far-bin builder was also rejected: hashes matched, but spatial-bin time stayed around 107 ms and whole-view time did not improve. Skipping the unused axis-bin rebuild alone saved only a few milliseconds; the capacity reservation was the useful part.
- Research: VTK's [Flying Edges documentation](https://vtk.org/doc/nightly/release/9.7/html/classvtkFlyingEdges3D.html) and the [LDAV 2015 paper](https://doi.org/10.1109/LDAV.2015.7348069) describe edge-oriented passes, count/prefix-sum allocation, preallocated output, and avoiding coincident-point merging. The current mesher still spends comparable sampled time in density-grid evaluation and vertex/triangle emission. A full multi-pass conversion is the strongest untested mesher option, but it is a larger rewrite with separate material-class, skirt, and degeneracy handling to preserve.
- Built and measured a per-worker lattice-edge vertex cache with the existing position hash retained as a fallback. The first version collapsed 2,477 vertices on the 16-worker whole view (1,792,739 vs 1,795,216) with the same triangle count, so it was rejected as a mesh change. The exact-key fallback version restored vertex counts, but totals were 1.884 / 1.484 s versus 1.886 / 1.471 s at 8 / 16 workers: no stable gain. Both prototypes were removed.
- Tested overlapping early far-tile meshing with the shape build. That path queued LOD2+ before the far-parent shapes and spatial index were built, so it could mesh against an incomplete field; its timing is invalid for a speed claim and the path was removed. Even the invalid trial was slower at 16 workers. Correct overlap needs an immutable, separately built far field before any dependent tile starts.
- The final no-hash composite whole view is 1.805 s at 8 workers and 1.454 s at 16; it still needs another 454 ms removed at 16 to meet the one-second target. The single-critical-tile split from the plugin review does not fit this LOD6 workload: there are 4,770 queued coarse tiles, and the worker pool is busy while they run. The 6-worker point, SIMD primitive batches, forward differences, Morton page order, and explicit coarse surfaces were not prototyped in this pass; explicit surfaces and a multi-pass edge mesher remain plausible larger experiments.
- Intel's [Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html) cautions that an intrinsic may expand to a slower instruction sequence. AVX2 batching of the irregular primitive/bin lookup was not assumed to help without a result-preserving prototype.
The final inline-bin source improves the comparable shape-build-plus-mesh result by about 9.6% at 8 workers and 10.8% at 16 versus this round's first cold baseline. The earlier round-three report's 2.095 / 1.617 s figures compare with 1.805 / 1.454 s here. Process-start timing is 1.958 / 1.629 s, so the one-second whole-view goal remains unmet.
## Determinism, routes, and surface checks
Four cold no-cache hash runs on the final built source (two at 16 workers, one each at 8 and 1) matched exactly. The field hash covers sampled density floats. The CPU-geometry hash covers each streamed tile's float positions, float normals, and indices, with tile keys included in deterministic LOD/Z/Y/X order. UV and color buffers are not stored in `FStandaloneCpuTile` and are not included in this geometry hash.
| Output | Density hash, identical in all runs | CPU geometry hash, identical in all runs |
| --- | --- | --- |
| Full-detail mesh | `0xa071e48a996e2828` | `0x6f270c621d39302f` |
| Whole clipmap | `0x630c43d7c68d5cbb` | `0xe3caf5b44244a992` |
| LOD0 | `0xc31fc55744c45928` | `0x7a70def3eb3e11ad` |
| LOD1 | `0xd74d6563f970d9f9` | `0xf47463988641b397` |
| LOD2 | `0xb0e440b4c9276bd7` | `0x9ed0581189757ee8` |
| LOD3 | `0xda4d3afb3467dd64` | `0xd8101bfb3ad87925` |
| LOD4 | `0x903537240ad6ae68` | `0x64c0b5e6a2e4f8ce` |
| LOD5 | `0x7c9e900fda72f05f` | `0x58c5139c40172196` |
| LOD6 | `0xc67d1f383fbf29ca` | `0xdc35accf7789860d` |
All runs reported zero mesh-cache hits. Each shape build retained all 5,642/5,642 passage route samples as open.
The saved earlier `final_exact_hash_*` set differs in full-detail, whole-clipmap, LOD0, and LOD1 hashes; LOD2–LOD6 match. The source/output change responsible for that older-to-current hash shift is still unexplained. The current hash set is stable across 1 / 8 / 16 workers and two 16-worker runs, but I do not claim bit identity with that earlier saved executable.
This verifies repeatability on this AVX2 host across 1, 8, and 16 workers. A second hardware host was not available, so cross-machine bit identity remains unverified here.
| Check | Final result |
| --- | --- |
| Chamber grid-stair index | 0.003 (threshold 0.400) |
| Tunnel grid-stair index | 0.028 (threshold 0.400) |
| Passage grid-stair index | 0.205 (threshold 0.400) |
| Shared tunnel joins | 280; endpoint radius and slope deltas 0.000000 / 0.00000000 |
| Whole-view level-zero sheet audit | 0 sub-voxel sheets, 0 isolated small components; 4 small boundary-touching components |
| Chamber flat-patch audit | 5.0% at the 16-voxel patch rule, largest 433 samples; audit passes, though it is not a visual sign-off |
The baseline tunnel stair audit without `--round-tunnels` measured 0.434 and failed the 0.400 threshold; the final tunnel view measures 0.028. The baseline chamber (0.041) and passage (0.276) already passed that threshold, so those two are improvements rather than fail-to-pass proofs. The earlier invalid baseline command with `--round-tunnels` remains recorded in [`round2/REPORT.md`](../round2/REPORT.md).
I reran the owner-field scan on the compact-bin source with the round-two settings: 8 workers, 960 full-resolution tiles for close views, 4-sample vertex stride, and 4,770 LOD6 tiles for far. `mesh_sample_mismatch=0` in each scan. The later vertex-map reservation only changes capacity; final no-cache density and CPU geometry hashes match the pre-reservation build exactly. The older saved scalar hashes differ, so these refreshed sign and distance results replace the stale “unchanged” claim.
| View | Lattice samples | Changed signs, before → current | Mean sampled surface distance, before → current | Max, before → current | Unmatched, before → current |
| Cold whole-view run | Process wall | Shape stage | Full clipmap stream | Shape + stream | Cache hits |
| --- | ---: | ---: | ---: | ---: | ---: |
| Chamber and tunnel region | 35,103,600 | 5.978% → 5.895% | 1.0325 m → 1.0826 m | 6.4677 m → 6.4840 m | 9,393 → 8,832 |
| Passage | 37,240,000 | 3.311% → 3.304% | 0.9814 m → 1.0292 m | 6.3422 m → 6.3750 m | 12,602 → 12,520 |
| Far view, LOD6 | 9,470,835 | 9.041% → 9.041% | 2.1667 m → 2.1588 m | 5.3070 m → 5.3070 m | 783,976 → 783,967 |
| A, 8 workers | 2.174 s | 0.828 s | 1.116 s | 1.944 s | 0 |
| B, 8 workers | 2.135 s | 0.836 s | 1.110 s | 1.946 s | 0 |
| Mean | **2.155 s** | **0.832 s** | **1.113 s** | **1.945 s** | 0 |
Closest-view sign disagreement fell slightly while mean surface distance rose; the far view changed almost not at all. These are sampled symmetric nearest-vertex distances, not continuous Hausdorff distances, and do not indicate that the generated world looks close to the owner.
The process runner includes executable start and world setup. The stream stage holds the 8-worker pool at 98.9–99.4% busy; LOD6 is the long pole. The full payload allocates 235.49 MiB across the view; the standalone viewer’s geometry copy is 115.67 MiB. The 27-tile LOD0 player neighborhood is CPU-mesh-ready 23 ms after streaming starts. Collision readiness remains unmeasured.
## Captures and visual review
### Stage comparison and per-LOD profile
The final rebuilt captures are in `rebuilt_after_*.png`. Five are byte-identical to the previous exact captures; the passage differs in 4 of 1,024,000 pixels by at most 1 channel value. The current captures look unchanged at display scale. Against the owner images, the chamber still has a broad smooth ceiling and floor where the owner view has more connected forms; the tunnel has smoother, more repetitive relief; the passage retains a horizontal shelf/dark opening and lacks the owner's layered profile; the far image lacks the owner's larger connected forms. The look remains visibly different and is not a match.
The first column is the earlier speed-round W8 baseline from the stale report. That run used the former full-machine policy and the older viewer payload. The current column uses the restored half-load policy and emits all mesh arrays. These values show where the work moved, but are not an apples-to-apples speedup claim.
| View | Before | Final after | Owner |
| --- | --- | --- | --- |
| Chamber | [before](../round2/final_after_chamber.png) | [after](rebuilt_after_chamber.png) | [owner](../final/chamber_fixed_owner.png) |
| Tunnel | [before](../round2/final_after_tunnel.png) | [after](rebuilt_after_tunnel.png) | [owner](../final/tunnel_fixed_owner.png) |
| Passage | [before](../round2/final_after_passage.png) | [after](rebuilt_after_passage.png) | [owner](../final/passage_fixed_owner.png) |
| Far view | [before](../round2/final_after_far.png) | [after](rebuilt_after_far.png) | [owner](../final/far_owner.png) |
| Passage-floor close-up | [before](../round2/final_after_passage_floor_closeup.png) | [after](rebuilt_after_passage_floor_closeup.png) | no owner close-up |
| Tunnel bend | [before](../round2/final_after_tunnel_bend.png) | [after](rebuilt_after_tunnel_bend.png) | no owner close-up |
| Whole-view stage | Earlier W8 baseline | Current W8 mean | Current run range |
| --- | ---: | ---: | ---: |
| Local shapes and line bins | 57.6 ms | 53.8 ms | 53.773–53.785 ms |
| Rock intervals, packed signs, candidate axes and mask merge | 132.6 ms | 138.3 ms | 138.111–138.506 ms |
| Surface detail band | 539.0 ms | 589.8 ms | 589.734–589.833 ms |
| Far-parent shapes and spatial bins | 194.7 ms | 41.9 ms | 38.438–45.407 ms |
| Shape build | 932.3 ms | 831.7 ms | 827.765–835.705 ms |
| All-LOD full-payload mesh generation | 1,064 ms | 1,113 ms | 1,110–1,116 ms |
| Shape build + mesh generation | 1.996 s | 1.945 s | 1.944–1.946 s |
## Build, process limits, and failed attempts
Per-LOD completion is cumulative from stream start. Each tile count and allocation figure is from the full-payload run.
The final build is [`vertex_map_reserve_build.log`](vertex_map_reserve_build.log). It succeeded with `/MP16`; the build host ran at Normal priority and affinity `0xFFFF`. It still reports the existing `vswhere.exe` setup diagnostic and six C4838 narrowing warnings in `VoxelStrateManager.cpp`. Benchmark processes ran Normal with `0xFFFF`; final whole-view no-cache runs peaked at 0.41 / 0.48 GiB private memory at 8 / 16 workers. All test processes were launched by this task; no external viewer was closed.
| LOD | Tiles | Density samples | Complete | Full payload allocation | Viewer geometry copy |
| ---: | ---: | ---: | ---: | ---: | ---: |
| 0 | 512 | 21.952 M | 0.137 s | 33.60 MiB | 16.30 MiB |
| 1 | 448 | 19.208 M | 0.214 s | 20.37 MiB | 10.07 MiB |
| 2 | 320 | 2.195 M | 0.231 s | 6.04 MiB | 2.96 MiB |
| 3 | 208 | 1.427 M | 0.244 s | 4.23 MiB | 2.09 MiB |
| 4 | 144 | 0.988 M | 0.251 s | 2.99 MiB | 1.49 MiB |
| 5 | 96 | 0.658 M | 0.258 s | 3.17 MiB | 1.57 MiB |
| 6 | 4,770 | 32.717 M | 1.109 s | 165.09 MiB | 81.18 MiB |
- One build wrapper invocation used a relative `Tee-Object` path. `Build.ps1` changed the working directory, so the log path resolved under `Standalone\Build` and the wrapper returned 1. I checked that no compiler remained active and reran with an absolute log path; the final build succeeded. This was a logging-path failure, not a compiler failure.
- One benchmark invocation referenced `Research\...\RunMachine.ps1` from the plugin root instead of `Standalone\Research\...`; PowerShell rejected the script path before an executable started. The corrected invocation completed.
- A `rg | head` inspection hit a Cygwin `CreateFileMapping` permission diagnostic; the source query was repeated with PowerShell and no build or benchmark was affected.
- The simple edge-cache prototype that produced fewer vertices and the early-far overlap prototype were rejected as described above. Their build/run logs remain in this directory; no such code remains in the final source.
- The parallel far-bin experiment built and ran successfully and kept exact hashes, but did not improve the bin stage or wall time; its code was removed.
- The historical `resume2_before_tunnel_audit.stdout.log` used `--round-tunnels` and is not a valid base-world comparison. The corrected no-`--round-tunnels` baseline is retained at 0.434 and failed the final 0.400 threshold, as described above.
- No compiler build or benchmark executable failed during this speed round. The flat-map and first larger inline-bin prototypes ran successfully but were rejected for slower total results. The corrected baseline stair audit still fails at 0.434 against the 0.400 threshold; this failure is preserved in the earlier report. No commit, push, or stash was made.
LOD6 emits 1,834,816 vertices and 10,272,252 indices. It accounts for 32.717 million density samples and most of the stream time. The detailed timings are in [run A](final_full_payload_w8_a.stdout.log) and [run B](final_full_payload_w8_b.stdout.log); their process records are [A](final_full_payload_w8_a.runner.log) and [B](final_full_payload_w8_b.runner.log).
## Logs
## Required mesh payload and skip verification
Baseline profiles: `profile_whole_w8.stdout.log`, `profile_whole_w16.stdout.log`. Final no-hash whole-view stages: `measured_whole_w8/w16.stdout.log`; process walls: `measured_whole_w8/w16.runner.log`. Full detail: `measured_detail_w8/w16.stdout.log` and `measured_detail_w8/w16.runner.log`. Final determinism on the exact rebuilt source: `final_source_hash_w1.stdout.log`, `_w8.stdout.log`, `_w16_a.stdout.log`, `_w16_b.stdout.log`. Cross-LOD edit latency: `reserve_edit_w8/w16.stdout.log`. Refreshed owner scans: `final_owner_bins_chamber_w8.stdout.log`, `final_owner_bins_passage_w8.stdout.log`, `final_owner_bins_far_w8.stdout.log`. Mesher attribution: `lod6_sample32_profile.stdout.log` and `vertex_map_reserve_profile.stdout.log`. Current audits/captures: `rebuilt_audit_*.stdout.log`, `rebuilt_shard_audit_w16.stdout.log`, `rebuilt_capture_*.stdout.log`, and `rebuilt_after_*.png`.
I inspected the actual plugin source read-only. [FVoxelMeshData](../../../../Source/VoxelForge/Public/VoxelTypes.h) contains one UV and one FColor per vertex, including dominant/neighbor biome palette, slope, and border blend channels. [BuildTileStreamSet](../../../../Source/VoxelForge/Private/VoxelWorld.cpp) enables TexCoords, Colors, and PolyGroups and copies those values into the game stream. It assigns group 0 to ground and group 1 to sky-cap ceiling; the ceiling uses material slot 1 and does not cast shadows. The mesher’s [UV/color emission](../../../../Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp) and cap ordering show why the viewer-only skips cannot be used for game output.
The current default is full payload. In the standalone copy, UV storage is FVector2f, matching the float UV sent to the game stream; this halves the UV staging width from FVector2D and saves about 20.6 MB over 2.58 million vertices. No stable speed gain appeared. FColor is already four-byte packed. The dense per-tile ceiling-column cache preserved hashes but did not improve stream time (1.099 s versus 1.098 s), so it was reverted. The final source retains the original per-column memo and emits ceiling/ground groups. I did not derive UVs or biome colors in a new shader: the game material path currently consumes TexCoord0 and the packed vertex-color channels, and plugin material/source changes were read-only in this task.
The three diagnostic skip variants were independently hash-checked at W8 over full detail, whole clipmap, and LOD0–6. Density hashes and a canonical oriented-triangle topology hash match full output in all nine outputs. The topology digest uses vertex position/normal identities, so it is insensitive to vertex IDs and triangle ordering.
| Diagnostic mode | Density equal | Serialized mesh hash equal | Oriented topology equal | Full payload hash equal |
| --- | ---: | ---: | ---: | ---: |
| Skip UV and colors | 9/9 | 9/9 | 9/9 | 0/9 |
| Skip material groups | 9/9 | 6/9 | 9/9 | 6/9 |
| Skip both | 9/9 | 6/9 | 9/9 | 0/9 |
The group skip reorders index output in three results; the geometric triangles and winding still match. The payload hash changes when UV/color arrays are omitted. These are diagnostic results only: dropping either data path changes the game’s stream contract. Combined skips took 1.533 s and 1.536 s process wall in no-hash runs, about 0.620 s below the full-payload mean, but this is not a valid game-generation result. Hash logs: [UV/colors](canonical_topology_skip_uv_w8.stdout.log), [groups](canonical_topology_skip_groups_w8.stdout.log), and [both](canonical_topology_skip_both_w8.stdout.log).
### Far-bin reserve A/B
The final far-bin reserve is 24 buckets per primitive; the axis-bin path retains 96. I rebuilt the same source with the old 2× far-bin estimate, then restored and rebuilt the final 24× source. All nine full-payload outputs matched exactly across density, mesh, payload, and topology hashes between the two reserve settings. The final 1-worker and 8-worker matrix also matches exactly.
Across two no-hash samples, the 2× build spent about 47.9 ms building far spatial bins; the 24× build averaged about 41.9 ms. Full stream time was effectively unchanged (1.1135 s versus 1.113 s), within run variation. I keep the capacity hint as a small build-stage improvement, not a whole-view speed claim. The old-estimate build and runs are logged in [build](reserve_ratio_old2_build.log), [hash](reserve_ratio_old2_hash_w8.stdout.log), [timing A](reserve_ratio_old2_timing_w8.stdout.log), and [timing B](reserve_ratio_old2_timing_w8_b.stdout.log).
## Final determinism matrix
The final executable was rebuilt after restoring the 24× reserve. The 1-worker and 8-worker cold hash runs had zero cache hits and all 5,642/5,642 route samples open. Each of the nine output hashes below matched exactly at both worker counts, including the full payload hash.
| Output | Density hash | Geometry mesh hash | Full payload hash | Oriented topology hash |
| --- | --- | --- | --- | --- |
| Full detail | 0xa071e48a996e2828 | 0x6f270c621d39302f | 0x33c7353b2eda16a7 | 0x1b39c8cc2ffed4b3 |
| Whole clipmap | 0x95c3f446cce0eaea | 0x5036df929534d3ef | 0xb9ed5e975705753b | 0xb0eec830b29044e1 |
| LOD0 | 0xc31fc55744c45928 | 0x7a70def3eb3e11ad | 0x5780ec294cd873c5 | 0xa3126405acc20185 |
| LOD1 | 0xd74d6563f970d9f9 | 0xf47463988641b397 | 0x7740ea61a08d30c7 | 0xb8a7cace0866efd3 |
| LOD2 | 0x44f878e3420376a2 | 0x17de625b9ceda2a9 | 0x1fe6c3de98251541 | 0x1c4ab868773fe313 |
| LOD3 | 0x80713f3f7e379bf9 | 0xec609008c8248eeb | 0x8f9c8b3d627933b4 | 0x27361f6a30c71959 |
| LOD4 | 0x726efa9eb9933226 | 0xdcb8c20437152e74 | 0xd01d47eeed04fd3a | 0x94972f103fa9bcac |
| LOD5 | 0x4345a3990bb8b68a | 0x8b7d9b5c1a0872a4 | 0x396b044b5a774097 | 0x0c5fb1df85d0d38c |
| LOD6 | 0xc78f04f08fc84094 | 0x2eab9309b9493d47 | 0xa93aedb363c18aa5 | 0x4f6059255abed405 |
These checks establish repeatability on this AVX2 host across 1 and 8 workers. Cross-machine identity was not tested.
## What helped and what was rejected
Retained work from the measured speed round:
- Parallel candidate-mask merging reduced the interval/sign stage by about 14 ms in the predecessor’s 16-worker profile while preserving hashes.
- A line-local value-noise cache reuses relief noise corners along Z; its 16-worker detail-band sample fell from about 375 ms to 298 ms with exact hashes.
- A lattice-specific mesher entry point removed repeated coordinate rounding. The predecessor’s 16-worker full-detail stream moved from about 183 ms to 129–141 ms in hash runs.
- Fusing repeated rock-distance evaluation preserved hashes and lowered one 16-worker hash-run stream sample from 698 ms to 624 ms.
- Direct far capsules replaced 181,836 distant connector primitives with 16,491 while keeping all routes open and hashes stable across worker counts. They cut far-parent construction by roughly 75 ms in the predecessor’s profile.
- The compact inline/spill bin list reduced far-bin construction while keeping primitive IDs in ascending query order. A flat open-addressed table and an earlier larger inline layout were rejected because total streaming slowed.
- The per-worker vertex-map reserve remains a small allocation hint: a 32-tile LOD6 sample moved from 33.513 ms to 33.145 ms, with no stable whole-view gain.
- The current 24× far-bin capacity hint saves about 6 ms in the measured far-bin stage against 2×, with exact hashes and no measurable full-stream change.
Rejected or not tested:
- Skipping UV/colors and skipping material groups improved the standalone diagnostic viewer only. They remain off by default because the game consumes those arrays and sections.
- The dense ceiling-column cache produced no stable stream improvement and was removed.
- A thread-local last-bin cache, parallel far-bin builder, per-tile field snapshot, and per-worker edge cache did not improve the final total. The first edge-cache version removed 2,477 vertices and was rejected as a geometry change.
- Early far-tile overlap changed LOD0/1 hashes while far parents were incomplete; the path was removed.
- The multi-pass Flying Edges-style mesher, AVX2 primitive batches, forward differences, Morton page order, Bernstein bounds, six workers, and explicit coarse far surfaces were not prototyped. The measured workload has 4,770 queued LOD6 tiles and a busy worker pool, so splitting one critical tile is not the current bottleneck.
Research retained for these choices: [Abseil Swiss tables](https://abseil.io/about/design/swisstables), [Meta F14](https://engineering.fb.com/2019/04/25/developer-tools/f14/), [VTK Flying Edges](https://vtk.org/doc/nightly/release/9.7/html/classvtkFlyingEdges3D.html), the [LDAV 2015 paper](https://doi.org/10.1109/LDAV.2015.7348069), and Intel’s [Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html). In particular, the latter cautions that an intrinsic does not guarantee a faster instruction sequence.
## Routes, joins, shape checks, and edit latency
Every final shape build reports 5,642/5,642 passage centerline samples open and retains the native landing floors. The three fixed-view grid-stair checks pass the 0.400 threshold.
| Fixed view | Grid-stair metric | Flat-patch share | Largest flat patch | Result |
| --- | ---: | ---: | ---: | --- |
| Chamber | 0.003 | 5.0% | 433 samples | Pass |
| Tunnel | 0.028 | 5.0% | 433 samples | Pass |
| Passage | 0.205 | 8.0% | 520 samples | Pass |
The chamber, tunnel, and passage detail checks pass at a 4-voxel supremum with an 8-voxel band. Shared tunnel joins: 280 in chamber/tunnel and 240 in passage; endpoint radius and slope deltas are 0.000000 and 0.00000000. The room-floor, floor-slope, C1 floor-profile, and tunnel-radius audits pass. The whole-view level-zero shard audit covers 512 tiles and finds zero thin sheets, zero isolated small components, and four small boundary-touching components.
The crater benchmark is one transaction containing three brushes (10 m diameter, 24 m from the player): a sphere carve, rounded-box cut, and capsule rim. At 8 workers it remeshed all 14 affected tiles with zero cache hits: 12 LOD0 and 2 LOD1. Remesh time was 14 ms; edit-to-ready was 17 ms. Collision cooking is unavailable in the standalone harness.
Current audit logs: [chamber](final_audit_chamber_w8.stdout.log), [tunnel](final_audit_tunnel_w8.stdout.log), [passage](final_audit_passage_w8.stdout.log), [whole-view shard/join audit](final_shard_audit_w8.stdout.log), and [edit transaction](final_edit_transaction_w8.stdout.log).
## Six fixed captures and visual review
All six captures were regenerated from the final full-payload executable at 8 workers and the half-load process limit.
| View | Fixed camera in metres; yaw/pitch in degrees | Current capture |
| --- | --- | --- |
| Chamber | (-11.75, -123.25, -19.85); 0 / 0 | [chamber](final_halflimit_after_chamber.png) |
| Tunnel | (-11.75, -123.25, -19.85); 90 / 0 | [tunnel](final_halflimit_after_tunnel.png) |
| Passage | (-39.19, 6.27, -28.51); 63 / 0 | [passage](final_halflimit_after_passage.png) |
| Far view | (-11.61244, -118.2212, -19.8452); 0 / 0 | [far](final_halflimit_after_far.png) |
| Passage-floor close-up | (-39.19, 6.27, -25.51); 63 / -25 | [floor close-up](final_halflimit_after_passage_floor_closeup.png) |
| Tunnel bend | (-198.97, -99.57, -45.58); 33.59 / 23.17 | [bend](final_halflimit_after_tunnel_bend.png) |
Five captures are byte-identical to the preceding rebuilt set. The passage view differs in 662 of 1,024,000 pixels, with a maximum channel delta of 97; side-by-side inspection shows the same framing and visible geometry. Against the owner images, the visual gap remains: the chamber still has broad smooth ceiling/floor areas, the tunnel has repeated relief bands, the passage keeps a horizontal shelf and dark opening instead of the owner’s layered profile, and the far view lacks the owner’s larger connected forms. The look is not a match.
The four owner-comparison references remain [chamber](../final/chamber_fixed_owner.png), [tunnel](../final/tunnel_fixed_owner.png), [passage](../final/passage_fixed_owner.png), and [far view](../final/far_owner.png). The earlier fixed captures are in [round 2](../round2/REPORT.md).
## Build limits and failed invocations
The final build is [final_halfload_build.log](final_halfload_build.log). It succeeded with /MP8. The build and workload processes ran BelowNormal on affinity 0xFF00. The recurring French vswhere.exe setup diagnostic still appears, followed by a successful compile; six existing C4838 narrowing warnings remain in VoxelStrateManager.cpp.
Failures during this continuation, with corrected work preserved:
- The first dense ceiling-column cache build used CellsPerAxis before its declaration. That build failed; the declaration was moved before use, the retry built, and the cache was later removed after a no-gain timing result.
- One audit runner call named StandaloneViewer.exe, which does not exist. RunMachine stopped before launching a child; the corrected executable is VoxelForgeStandalone.exe.
- The first six-capture wrapper assembled --camera and --capture arguments as separate strings. Each process exited 2 on Invalid --camera value before opening a viewer. The arguments were corrected and all six final captures completed with exit code 0.
- An earlier wrapper call used a relative Tee-Object path after Build.ps1 changed directories. Its log redirection failed; the build was checked and rerun with an absolute log path.
- Older exploratory audit and optimization failures from the look round remain documented in [round 2](../round2/REPORT.md) and its retained logs.
No external viewer was closed. No commit, push, or stash was made. All source, report, and capture edits are within Standalone.
## Principal logs
- Final no-hash full-payload timings: final_full_payload_w8_a/b.stdout.log and final_full_payload_w8_a/b.runner.log.
- Final restored hash matrix: final_restored_full_hash_w1.stdout.log and final_restored_full_hash_w8.stdout.log.
- Skip checks: canonical_topology_full_hash_w1/w8.stdout.log and canonical_topology_skip_uv_w8, canonical_topology_skip_groups_w8, canonical_topology_skip_both_w8.stdout.log.
- Reserve A/B: reserve_ratio_old2_build.log and reserve_ratio_old2_*.stdout.log.
- Current audits, edit run, and captures are listed above; capture process output is in final_capture_*_w8.stdout.log.
- Machine runner policy: RunMachine.ps1. Build flags and limits: Build.ps1.