research(L64, R33): regression bisect -- Core +16% worker time L14->L61, not 2x; four-strate plan baseline
Per-round bisect of a176d07..3202193 (56 builds; timings inflated by concurrent UE builds) plus a clean quiet-machine endpoint re-measure: L14 12.62 vs L61 14.65 worker-s (+16%), LOD0 3.99 vs 4.99 ms/tile. The owner's Windows x2 is therefore mostly on the Unreal side or not like-for-like. Four-strate U2 plan: all strates generate and are deterministic; passage 0-1 lower mouth is out of FI's band, 0/3 interfaces pass, FI/TN/VS use legacy evaluators. R33: ranked Unreal-side suspects and Windows experiments. 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
9136f5f0e7
commit
e157847509
3 files changed
+215
No files matched your search
@@ -0,0 +1,19 @@
|
||||
# Ranked suspects
|
||||
|
||||
1. **Resolved passage and strata geometry** — [VoxelForgeCoreAdapter.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1584), [VoxelStrateTypes.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:2074). The adapter sends each strate’s passage settings into Core’s resolved layout. The default passage style changed from Straight to Worm, with one connection and 20 segments by default. L18–L37 also added shared ceiling/bedrock composition, planned passages, support geometry, transitions, and mouth fades. These can add field queries and mesh crossings where tiles overlap them. U1 confirms CoreGeometry is empty in the owner assets, but does not report the effective passage settings. **Windows check:** log each strate’s resolved style, connection count, segments, planned route count, plus tile vertices and Core time. Then run a diagnostic A/B with a duplicate settings asset set to `Connections=0`. This changes geometry, so compare only cost and sample counts.
|
||||
|
||||
2. **Unreal may mesh a wider Z band than standalone.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13270) sets Core mesher options but leaves band limits at their unbounded defaults. Standalone sets `bandMinZVoxel` and `bandMaxZVoxel` from the current strate when its content-cut setting is active ([StreamingWorld.h](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:823)); those bounds restrict mesher sampling. Core also applies its own band limit to eligible native SurfaceWorld tiles, so this mainly affects other or non-native-safe tiles, and only when they cross the band. **Windows check:** add a temporary `voxel.CoreStrateBand` switch to pass the standalone-equivalent bounds; compare matched tile keys, density sample counts, and Core time.
|
||||
|
||||
3. **Unreal’s post-Core mesh conversion.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13333) copies Core vertices and indices into Unreal arrays and builds an RMC stream set after `generateTile`. Standalone also copies the mesh, but into CPU vectors. This wrapper code was not changed in the range; larger meshes from the new geometry could still make this stage costly. **Windows check:** log separate durations for `generateTile` and conversion/`BuildTileStreamSet`, with vertex and index counts. The existing cycle boundaries bracket these stages at lines 13296 and 13358.
|
||||
|
||||
4. **Shape-free readiness can affect startup scheduling, not steady tile cost.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13100) caches `isTileShapeFree` results while compilation is pending and admits proven native-only tiles. Core uses the same native-only rule in standalone; L44 did not disable it for Unreal. A stricter proof could delay initial submissions or raise tick cost during compilation, but should not double worker time after the shape is ready. **Windows check:** count shape-free/dependent checks and requests while `bShapeReady=false`; record `nativeOnlyRoute` for early tiles.
|
||||
|
||||
5. **Legacy-only hot helpers and optional background work are low-probability suspects.** L60’s unsigned hash fix in [VoxelCaveMorphology.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelCaveMorphology.h:261) can affect legacy noise evaluation, but is not the Core tile field path. L61’s clipmap arithmetic is scheduling/bookkeeping; the bounded seal helper is for legacy density generation. Density-volume fills are separate tasks and default off ([VoxelSettings.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelSettings.h:317)). **Windows check:** confirm Core remains enabled, hash capture/profile are off, and the density-volume startup log says disabled. If investigating legacy fallback, profile its density field separately.
|
||||
|
||||
The source defaults for `FullResClipLevels` (2), `CoarseTileCells` (16), `CoreClipRadius` (3), and `CoreMaxClipLevel` (8) did not change in this range. U1 reports the owner’s clip radius/max level as 3/8. Its unit migration preserved the audited physical heights, transitions, gap, and 8 m layout width, so those migrations do not indicate a resolution increase. The shared column cache is Core-owned and enabled by default in both paths; standalone explicitly enables it. Unreal’s gradient memoization defaults on too. Core forces direct-mapped indexing for LOD 0–2 regardless of the Unreal cache CVar, so that CVar is not a useful LOD0 fix.
|
||||
|
||||
## Adapter vs standalone
|
||||
|
||||
Unreal serializes the owner assets into a resolved snapshot, parses it, creates `VoxelForgeCore::World`, then requests tiles through `World::generateTile` ([initialization](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7591), [tile request](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13288)). Standalone’s headless streamer also calls that Core method ([StreamingWorld.h](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:882)). They share the Core field and mesher, but differ in task scheduling, tile post-processing, and the Z-band options noted above. CoreGeometry resolution, JSON conversion, anchor parsing, and layout-unit conversion happen at initialization; U1’s owner assets have no CoreGeometry, so those additions do not resolve stamps or graphs per tile.
|
||||
|
||||
For the Windows run, use a Task Graph Insights trace (`-trace=default,task`) to compare worker availability and task contention alongside the stage timings; Epic documents task lifecycle tracing in [Task Graph Insights](https://dev.epicgames.com/documentation/unreal-engine/task-graph-insights-in-unreal-engine-5?lang=en-US). The checked-in U1 report contains the timing and asset audit, but the raw `Saved/BuildHost` logs were not present in this checkout.
|
||||
Reference in new issue
Block a user