From 22186473f9541160cbd0b71ec7902b407b5db144 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sun, 13 Sep 2026 23:05:33 +0200 Subject: [PATCH] perf(generation): spatial index default on; the 10 s question and the unknown bucket, answered Measurement round (Codex; checked against its report): - Per-tile identity for ab4bbe3's always-on LOD0 changes: a fresh 841-tile HEAD trace matches traces recorded before them (MemoStaticOn/Off), keyed by (x,y,z,level) with verdict/empty/triangles compared. 0 differences, 0 missing; LOD totals identical, 669,834 in all. - The "missing 10 s" is not the spatial index: all six TileCacheWindow x SpatialIndex combinations are within ~1% for a given window setting. TileCacheWindow=0 at HEAD is not 2990009's path. It still thrashes at L3/L4 (p95 ~250 ms). The default beats 2990009 on every metric: static worker 48 -> 34.4 s, moving 125 -> 101 s, LOD0 generation p50 73 -> 66 ms static and 70 -> 62 ms moving. - voxel.SpatialIndex default -1 -> 1: forced-on was marginally best in every pair (within noise). - The sampler's "unknown" ~13.8% LOD0 leaf is ucrtbase.dll!_finite (RVA 0x3C080), the non-inlined CRT call behind FMath::IsFinite, not Core.dll. Named by parsing Core's export table (no export at or below 0xC080) and aggregating callers: the tunnel chain, passage landing/floor checks, GetDensityWithParams, GetDensityAt, the spatial index range and EvaluateSDFCached. Gates: export OBJ unchanged (b3e5f4c3..9b377), capability 20,830 / 10,909, determinism assertion passed. Next: an inline bit-test IsFinite (the same predicate for every input, so field-exact). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01TaFdXhTdYMkW1xrV6ApT6Y --- Source/VoxelForge/Private/VoxelGenerator.cpp | 2 +- WORK-NEXT.md | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Source/VoxelForge/Private/VoxelGenerator.cpp b/Source/VoxelForge/Private/VoxelGenerator.cpp index 97c49b4..ce0d243 100644 --- a/Source/VoxelForge/Private/VoxelGenerator.cpp +++ b/Source/VoxelForge/Private/VoxelGenerator.cpp @@ -78,7 +78,7 @@ namespace GVoxelForgeTileCacheWindowOpStackMinLOD, TEXT("Minimum SampleStep LOD for the op-stack tile-sized room cache window.")); - int32 GVoxelForgeSpatialIndex = -1; + int32 GVoxelForgeSpatialIndex = 1; FAutoConsoleVariableRef CVarVoxelForgeSpatialIndex( TEXT("voxel.SpatialIndex"), GVoxelForgeSpatialIndex, diff --git a/WORK-NEXT.md b/WORK-NEXT.md index a84edb5..0099d54 100644 --- a/WORK-NEXT.md +++ b/WORK-NEXT.md @@ -157,6 +157,19 @@ generation p50 is ~4% slower than at `2990009` (73 -> 77 ms static). Queued: att in-tree switches (first suspect: `voxel.SpatialIndex` auto-on at fused LOD1-2), never by running old commits. +**Resolved 2026-09-13 (`ab4bbe3` + the switch sweep):** not the spatial index; every `SpatialIndex` +setting is within ~1%. `TileCacheWindow=0` at HEAD is a different configuration from `2990009`, not +the old path. It still thrashes at L3/L4 (p95 ~250 ms), now at 54 s. The DEFAULT beats `2990009` on +every metric: static worker 48 -> 34 s, moving 125 -> 101 s, LOD0 generation p50 73 -> 66 ms static +and 70 -> 62 ms moving. The "LOD0 ~4% slower" worry is gone. `SpatialIndex` now defaults to 1 +(marginally best, within noise). Per-tile identity: 0/841 tiles differ against traces recorded +before the always-on LOD0 changes. + +**Next LOD0 target, found by the sampler's caller aggregation:** the "unknown" ~13.8% LOD0 leaf is +`ucrtbase.dll!_finite`, the non-inlined CRT call behind `FMath::IsFinite`. Its callers are the tunnel +chain, passage landing/floor checks and `GetDensityAt`. An inline bit test is exactly the same +predicate, so it changes no field. + ### Open design questions for the owner - All five strate slots resolve to `DA_Strate3`. Intended? - Should a composer roll be allowed to overwrite an explicitly authored value?