research(R28, self-checked): per-generator cost ledger; caves/motifs/lattice timings were LOD0-only views, not comparable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
1 parent
6c6cc37e1d
commit
fbae82e024
2 files changed
+122
No files matched your search
@@ -0,0 +1,66 @@
|
||||
# R28 — revised report
|
||||
|
||||
I withdraw the earlier claim that the motif/profile timing gap identifies a code-path cost. The runs are not comparable, and the logged stage timings are not a complete additive breakdown of wall time.
|
||||
|
||||
## Cost ledger
|
||||
|
||||
Worker sums are **CPU seconds across workers**, not wall seconds. The LOD sums below are derived by adding the indicated per-LOD log rows. The per-tile figure is their total divided by the run’s tile count; it is a workload average, **not** isolated dispatch overhead.
|
||||
|
||||
| Generator | Whole-view wall time | Shape stage: total (local; intervals/signs; surface band; far parents), ms | LOD worker-s: 0–1 / 2–3 / 4–8 | Average worker time per tile |
|
||||
|---|---|---|---|---|
|
||||
| Natural SurfaceWorld | 1.786 s in a raw paired run ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/cost-surface-world-pair1-baseline.log:83>)); separate instrumented static run: 1.590 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9565>)) | 403.838 (35.042; 76.196; 235.239; 50.008) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:66>)) | 3.472580 / 1.965454 / 7.878235 s, derived from [LOD 0](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9556>), [1](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9557>), [2](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9558>), [3](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9559>), [4](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9560>), [5](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9561>), [6](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9562>), [7](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9563>), [8](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9564>) | 5.62 ms/tile, derived: 13.316269 worker-s ÷ 2,370 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9565>)) |
|
||||
| flatField profile | 1.330 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:41>)) | 432.380 (35.708; 77.840; 243.355; 67.675) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:33>)) | 3.757256 / 1.936127 / 4.675822 s, derived from [LOD 0](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:42>), [1](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:43>), [2](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:44>), [3](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:45>), [4](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:46>), [5](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:47>), [6](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:48>), [7](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:49>), [8](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:50>) | 4.66 ms/tile, derived: 10.369205 worker-s ÷ 2,226 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:21>)) |
|
||||
| Caves | 0.706 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log:89>)); the L54 report records 0.727 s ([report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:37>)) | 60.375 (27.537; 13.054; 19.202; 0) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log:66>)) | 5.773526 / not run / not run; LOD 0 only ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log:80>)) | 7.92 ms/tile, derived: 5.773526 worker-s ÷ 729 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log:74>)) |
|
||||
| Motifs | 0.524 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log:44>)) | 45.207 (27.253; 14.085; 3.510; 0) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log:36>)) | 4.888551 / not run / not run; LOD 0 only ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log:1418>)) | 14.25 ms/tile, derived: 4.888551 worker-s ÷ 343 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log:25>)) |
|
||||
| Lattice | 1.647 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l58/lattice-speed-clang-w12.log:89>)); the L58 report records 1.694 s ([report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux58/REPORT.md:19>)) | 136.529 (61.169; 35.675; 38.559; 0) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l58/lattice-speed-clang-w12.log:66>)) | 17.254969 / not run / not run; LOD 0 only ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l58/lattice-speed-clang-w12.log:80>)) | 23.67 ms/tile, derived: 17.254969 worker-s ÷ 729 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l58/lattice-speed-clang-w12.log:55>)) |
|
||||
| Floating Islands | 5.028 s paired median ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l57/verify-full-passagefix.log:1164>)); older diagnostic run: 4.899 s ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:79>)) | 444.665 (36.714; 85.436; 262.287; 52.390) ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:71>)) | 32.535211 / 3.989240 / 13.653194 s, derived from [LOD 0](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9561>), [1](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9562>), [2](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9563>), [3](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9564>), [4](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9565>), [5](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9566>), [6](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9567>), [7](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9568>), [8](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9569>) | 21.17 ms/tile, derived: 50.177645 worker-s ÷ 2,370 tiles ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/fi.log:9570>)) |
|
||||
|
||||
“Not run” means those LODs were excluded by the fixture configuration, not that their cost was zero. Shape component values are the logged bins; their sums do not exactly equal the logged ShapeStage total. No separate fixed per-tile dispatch cost is isolated. The average worker time per tile includes density evaluation, grid work, skirts/refinement and mesh assembly.
|
||||
|
||||
The far-LOD work is visible in the SurfaceWorld LOD rows: LOD4–8 account for **7.878235 worker-s**, derived above. In those rows, column evaluation totals **2.699576 worker-ms**, cap refinement **870.358 worker-ms**, and skirts **789.370 worker-ms**, derived from the [LOD4](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9560>) through [LOD8](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log:9564>) counters. Connectors are not reported as a separate counter. This is CPU work, not wall time.
|
||||
|
||||
Every run pays some owner-data loading, plan/layout resolution, shape setup and per-requested-tile scheduling/meshing. The directly logged preflight is only a few to tens of milliseconds here—for example, owner-data load is 5.193 ms and plan timing 10.991 ms for flatField ([log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:4>), [log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:20>)). Shape setup is not a universal fixed half-second: it ranges from 45 ms in the restricted motif run to roughly 404–445 ms in the full SurfaceWorld/FI diagnostics. Far LODs are not paid when a fixture requests only LOD0.
|
||||
|
||||
## Motifs versus flatField profiles
|
||||
|
||||
The **2.54×** headline ratio is derived from `1.330 ÷ 0.524`; it does not isolate field cost.
|
||||
|
||||
Both fixtures set `surface_profile_override.kind` to `flatField` ([flatField fixture](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/fixtures/style-override-profile-flatField.json:29320>), [motif fixture](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/fixtures/style-override-motifs-slice1.json:29320>)). Both logs use the `SurfaceWorld` recipe, the same worker count, clip radius and zero camera step. They also report the same stratum range and passage: strate 1, chunks −16…−79, route points 33, and passage `passage/0-1/0`, segments 153…1790 with the same vertical span. Both report no Floating Islands stratum ([flatField log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log:15>), [motif log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log:19>)).
|
||||
|
||||
They are **not the same view**. The flatField log requests LOD0–8 and reports 2,226 tiles; the motif log forces max level 0 and reports 343 tiles. The motif run also has `render_distance_override=yes`, versus `no` for flatField. Both HeadlessConfig lines say `camera_step_m=(0,0,0)`, but neither records the absolute starting camera. The motif fixture adds two SDF records. These differences prevent attributing the timing ratio to code path or terrain.
|
||||
|
||||
The code confirms there is no cheaper motif base-field branch. Both resolve through the `SurfaceWorld` adapter to `Heightfield2D`; [the adapter](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:49>) wraps that evaluator, and [native SurfaceWorld dispatch](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6257>) selects it. `Heightfield2D::point` uses the cached column and computes the density from ground and cap heights ([source](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2576>)).
|
||||
|
||||
The flatField specialization is actually cheaper per height sample than a patterned profile: it skips the cosine calculations:
|
||||
|
||||
```cpp
|
||||
std::int64_t relief = 0;
|
||||
if (profile.kind != WorldAssemblySurfaceProfileKindV1::flatField)
|
||||
{
|
||||
// cosine-based relief calculation
|
||||
}
|
||||
```
|
||||
|
||||
([source](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:1830>))
|
||||
|
||||
Motifs add a bounded stamp overlay after the base density ([call site](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:1838>), [stamp bounds and candidates](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6877>)). Caves use a different adapter for constant host rock before cavern composition ([source](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:137>)); that is not the motif path. So the logs show a shared SurfaceWorld base with extra motif work, not a primitive motif shortcut.
|
||||
|
||||
## Shared plan, ranked by measured work
|
||||
|
||||
The fact-card targets imply required wall reductions of **0.78 s** for Natural SurfaceWorld (`1.78 − 1`), **0.33 s** for flatField (`1.33 − 1`), and **0.69 s** for Lattice (`1.69 − 1`). These are derived target gaps, not predicted savings. Caves and motifs are already below one second in their restricted LOD0 runs; that does not establish their full-view times.
|
||||
|
||||
1. **Reduce far-LOD grid, cap and skirt work.** The measured SurfaceWorld LOD4–8 pool is 7.878235 worker-s; flatField’s is 4.675822 worker-s. That is the largest shared measured pool for the full-view heightfield runs. It is an opportunity estimate, not an achievable gain. Keep exact density, mesh and seam checks. Falsify the optimization if per-LOD work falls but matched whole-view wall time does not improve, or if far connectors, caps or skirts fail geometry checks.
|
||||
|
||||
2. **Reduce or reuse cold shape setup.** Full-view diagnostics show about 0.404 s for SurfaceWorld, 0.432 s for flatField and 0.445 s for FI. This offers a broad but limited ceiling; no saved result shows how much can safely be removed. Falsify it if the ShapeStage time drops without lowering matched cold whole-view time, or if reuse changes route/passage outputs.
|
||||
|
||||
3. **Specialize the shared heightfield/grid work.** SurfaceWorld LOD0–1 used 3.472580 worker-s; the flatField run used 3.757256 worker-s across LOD0–1. The Lattice fixture used 17.254969 worker-s at LOD0, but requested no far LODs. A common optimization may help profiles and Natural SurfaceWorld, but the Lattice sample cannot justify transferring a far-LOD technique. Falsify it if field/grid counters and worker time do not fall on a matched view, or if canonical hashes and surface/passage audits change.
|
||||
|
||||
4. **Keep Caves and Motifs as regression cases until their views match.** Their existing 0.706 s and 0.524 s logs cover 729 and 343 LOD0 tiles respectively. A same-view rerun is needed before claiming either is already near one second on the 2,370-tile workload.
|
||||
|
||||
Before judging gains, rerun the generators with the same tile keys, LOD counts, camera, hash setting and passage/FI structure. The current logs fail that comparability check. The reference image is unavailable here, so visual fidelity cannot be checked in this report.
|
||||
|
||||
## What remains unknown
|
||||
|
||||
The logs do not isolate fixed dispatch cost per tile, do not consistently expose field/column counters, and do not provide a same-view Motif/Profile comparison. Several headline values also come from different measurement series: for example, the Caves speed log says 0.706 s while its report says 0.727 s; Lattice says 1.647 s in the speed log and 1.694 s in its report. I have kept those distinctions rather than treating them as one measurement.
|
||||
|
||||
I did not change the tree or run scripts, tests, builds or binaries.
|
||||
@@ -0,0 +1,56 @@
|
||||
# VoxelForge R28 — fixed cost across generators
|
||||
|
||||
**Read-only review.** I made no source changes and ran no scripts, tests, builds, or binaries.
|
||||
|
||||
## Cost decomposition
|
||||
|
||||
One comparability issue changes the interpretation: the saved whole-view logs do **not** show the same 2,370-tile view for every recipe. The L55 SurfaceWorld trace has 2,370 tiles. The flatField profile trace has 2,226 tiles at LOD0–8; the caves and lattice traces have 729 tiles at LOD0 only; and the motif trace has 343 tiles at LOD0 only. The per-generator totals below are useful, but the motif-versus-profile totals are not a matched-view comparison. ([L55 timeline](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/lod-stage-sums.txt>), [flatField log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l53/profile-cold-view-flatField-clang.log>), [caves log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log>), [motif log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log>), [lattice log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l58/lattice-speed-clang-w12.log>))
|
||||
|
||||
The table’s LOD and per-tile figures are **summed worker time**, not wall time. “Worker ms/tile” includes field and mesh work; the logs do not isolate pure per-tile dispatch overhead. Don’t add worker seconds directly to shape seconds.
|
||||
|
||||
| Generator | Whole view | Shape setup | LOD0–1 worker time | LOD4–8 worker time | All-LOD worker ms/tile |
|
||||
|---|---:|---:|---:|---:|---:|
|
||||
| Natural SW | 1.78 s | 0.40–0.46 s | 3.473 s / 960 tiles | 7.878 s / 882 tiles | 5.62 |
|
||||
| flatField profile | 1.33 s | 0.432 s | 3.757 s / 960 | 4.676 s / 738 | 4.66 |
|
||||
| Caves | 0.73 s | 0.060 s | 5.774 s / 729, LOD0 only | Not measured | 7.92 |
|
||||
| Motifs | 0.52 s | 0.045 s | 4.889 s / 343, LOD0 only | Not measured | 14.25 |
|
||||
| Lattice | 1.69 s | 0.137 s | 17.255 s / 729, LOD0 only | Not measured | 23.67 |
|
||||
| FI | 5.03 s | 0.445 s diagnostic | 32.535 s / 960 | 13.651 s / 882 | 21.17 |
|
||||
|
||||
Whole-view values are from the supplied facts and the round reports. The per-LOD traces show why they cannot all be decomposed on the same basis: L55 has the all-LOD SW and FI trace; L53 has the flatField breakdown; the other three speed logs use `max_clip_level=0`. FI’s worker sums are from the L55 static trace, before the later L57 Z-inner traversal change. ([L53 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux53/REPORT.md>), [L54 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md>), [L55 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux55/REPORT.md>), [L56 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux56/REPORT.md>), [L58 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux58/REPORT.md>))
|
||||
|
||||
In the full SW trace, LOD4–8 account for 7.878 worker seconds, versus 3.473 seconds at LOD0–1. The LOD0 tiles alone scan 16.78 million candidate cells; the trace records no proof-skipped air or solid cells. Across the queued run, workers were idle with work waiting for only 9.957 ms. That points to grid and mesh work, including skirts and far-LOD work, rather than scheduler idle time. ([L55 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux55/REPORT.md>), [SW trace](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l55/timeline-static/sw.log>))
|
||||
|
||||
What’s shared is the view’s tile set, task submission, and meshing machinery for tiles that still need geometry. Shape setup is **not** a universal 0.4-second floor: it ranges from about 45 ms for the logged motif run to 432 ms for flatField, and far-parent setup is conditional. Nor does every recipe pay for LOD4–8 in the cited runs. The `ShapeStage` log separates local shapes, intervals/signs, surface band, and far parents; the tile stages expose grid, connectors, ground/cap, skirts, and assembly work. ([shape-stage code](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:2392>), [far-parent code](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:2975>))
|
||||
|
||||
## Why Motifs is 0.52 s and flatField is 1.33 s
|
||||
|
||||
The logged runs explain much of the difference without proving a 2.5× code-path penalty. Motifs ran with `max_clip_level=0`: 343 LOD0 tiles, a 45 ms shape stage, and no far-parent stage. flatField ran through LOD8: 2,226 tiles and a 432 ms shape stage, including 243 ms for the surface band and 68 ms for far parents. The shape-stage gap is 387 ms; the remaining whole-view difference is confounded by the much larger tile set and extra LODs.
|
||||
|
||||
Motifs is also **not** a separate caves-style primitive terrain path. Its fixture is a SurfaceWorld stratum with two sparse SDF motif fills. The base SurfaceWorld field uses `Heightfield2D`; the motif records add bounded primitive shapes. Caves instead binds an `FCavesFieldAdapter` over host rock and composes cave features into it. ([motif log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l56/motif-slice1-cold-view-clang.log>), [field adapters](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:137>), [SurfaceWorld dispatch](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6257>))
|
||||
|
||||
FlatField does skip the profile cosine work and assigns constant ground and cap heights. But each point still goes through the heightfield column path and computes signed distance to the ground and cap; the tile mesher still builds the requested surfaces and LOD geometry. ([flat profile evaluation](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:1830>), [heightfield point evaluation](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2576>))
|
||||
|
||||
## Recommendation
|
||||
|
||||
**Reuse proofs and far-LOD handling; don’t move the whole heightfield family onto the caves primitive path.** The two paths have different contracts. A wholesale move would need to reproduce SurfaceWorld profiles, biome and feature behavior, water samples, cap handling, route composition, and cross-LOD continuity. It would add a second implementation without evidence that it removes the dominant meshing cost.
|
||||
|
||||
A ranked plan:
|
||||
|
||||
1. **Wire conservative classification into runtime tile work.** Heightfield interval and lattice classifiers already exist, and caves demonstrably skips 638 of 729 tiles in its logged run. The SW trace, by contrast, records zero air/solid proof skips. First verify why that proof is not reducing SW’s cell work; then use certified all-air/all-solid boxes to avoid density sampling and meshing where safe. This is the best shared opportunity for profiles, natural SW, caves, and lattice. ([heightfield classifier](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2672>), [API proof contract](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/API.md:132>), [caves timing](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l54/caves-speed-clang-w12.log>))
|
||||
|
||||
2. **Optimize SurfaceWorld’s far LODs and LOD0–1 together.** SW’s LOD4–8 work is 7.878 worker seconds, but L55’s estimate says reaching 1 s requires cutting about 6.164 worker seconds overall. Removing LOD0 or LOD6–8 alone cannot meet that target. Reuse cached ground/cap columns and simplify far-surface generation only where interval proofs preserve the ground, cap, connectors, and seams.
|
||||
|
||||
3. **Add a heightfield-specific fast path for simple profiles.** FlatField already avoids noise evaluation, yet still pays general 3D density and meshing costs. A direct ground/cap path could target the additional 0.33 s needed for profiles to reach 1 s. Extending it to natural SW could yield more, but has higher risk because feature composition and terrain variation must remain correct.
|
||||
|
||||
4. **Tune primitive LOD0 work per recipe.** The logged lattice run has 17.255 worker seconds on 729 LOD0 tiles; reaching 1 s from its reported 1.69 s needs a large reduction. Keep caves as a regression guard: its reported 0.73 s is already under target. Motifs also reports under 1 s, but its 343-tile LOD0 run does not establish full-view performance.
|
||||
|
||||
5. **Deprioritize scheduler changes.** The full-view SW trace has only 9.957 ms of worker-idle time while queued work remains. A large scheduling gain is unlikely without new evidence.
|
||||
|
||||
For each performance claim, first rerun all recipes with identical tile keys, LOD range, hash flags, compiler, and worker count. Record whole-view wall time, shape stages, per-LOD worker sums, cell/proof counts, and connector/ground/cap/skirt time. For candidate changes, compare interleaved runs and check output hashes, route support, and LOD seams. Lattice needs particular focus: its logged LOD0 run is 1.69 s despite using 729 tiles.
|
||||
|
||||
Conservative cell classification is an established isosurface optimization technique, but published speedups are dataset-specific and are not a forecast for VoxelForge. [Buatois and Caumon, “Cells classification data structures for faster isosurface extraction”](https://www.ring-team.org/research-publications/ring-meeting-papers?id=935&view=pub)
|
||||
|
||||
## Still unknown
|
||||
|
||||
The saved logs do not substantiate the claimed common 2,370-tile benchmark; a matched full-view run is needed to settle the motif/profile comparison. They also do not provide the same stage-level timing for every recipe. In particular, the true per-tile dispatch cost and the full-view primitive-path costs for caves, motifs, and lattice remain unisolated.
|
||||
Reference in new issue
Block a user