streaming: near LODs first (walkable ring, LOD0, LOD1, LOD2, then far); exact passage trims (L78)

- Headless and Unreal schedulers drain the collision-critical ring, then LOD0-2, then far LODs
  at low priority. LOD0-2 ready (W8 medians): SW 4.36->1.76, FI 6.89->5.26, TN 4.88->3.22,
  VS 2.71->1.56 s. Whole view roughly unchanged (FI/VS slightly later).
  KNOWN RISK: far tiles wait until every near tile is ready, so far LODs may starve while
  moving fast (to address next).
- Exact composer trims: tile-level upper-mouth candidate list, segment-index min/max rejection
  before lower_bound, 64-entry thread-local value-noise corner cache. Passage share 65 -> 63%.
- World exact: 24/24 hash matrix + pinned L75 owner hash. 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
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-27 19:13:45 +01:00
1 parent 5e091d254c
commit ec20994a8e
10 files changed
+718 -52

No files matched your search

@@ -5061,6 +5061,7 @@ namespace StandaloneStreamBenchmark
*VoxelForgeCore::Linux77Profiler::RouteCount*2>,9> L77DispatchByLOD{};
std::array<std::uint64_t,9> L77GridInteriorByLOD{},L77GridHaloByLOD{};
std::array<double,9> L77LODReadySeconds{};
std::array<double,9> LODReadySeconds{};
std::array<std::uint64_t,9> SkirtTrianglesByLOD{};
std::array<std::uint64_t,9> TileCountByLOD{};
std::array<std::uint64_t,9> ClassifiedAirTilesByLOD{},ClassifiedSolidTilesByLOD{};
@@ -5129,6 +5130,9 @@ namespace StandaloneStreamBenchmark
const std::size_t LOD=static_cast<std::size_t>(Tile.Key.Level);
const auto& TileDiagnostics=Tile.CoreDiagnostics;
++TileCountByLOD[LOD];
if(TileCountByLOD[LOD]==ExpectedTilesByLOD[LOD])
LODReadySeconds[LOD]=std::chrono::duration<double>(
Tile.CompletedAt-ColdStart).count();
if(bLinux77Profile)
{
const auto& D=TileDiagnostics;
@@ -5551,6 +5555,23 @@ namespace StandaloneStreamBenchmark
}
}
}
double NearLODReadySeconds=0.0;
uint64 NearLODExpected=0,NearLODCompleted=0;
for(std::size_t LOD=0;LOD<=2;++LOD)
{
NearLODExpected+=ExpectedTilesByLOD[LOD];
NearLODCompleted+=TileCountByLOD[LOD];
if(ExpectedTilesByLOD[LOD]!=0)
NearLODReadySeconds=std::max(NearLODReadySeconds,LODReadySeconds[LOD]);
}
std::printf("[WorldAssemblerNearLODReady] lods=0-2 tiles=%llu/%llu cold_ready_s=%.6f\n",
static_cast<unsigned long long>(NearLODCompleted),
static_cast<unsigned long long>(NearLODExpected),NearLODReadySeconds);
for(std::size_t LOD=0;LOD<TileCountByLOD.size();++LOD)
if(ExpectedTilesByLOD[LOD]!=0)
std::printf("[WorldAssemblerLODReady] lod=%zu tiles=%llu cold_ready_s=%.6f\n",
LOD,static_cast<unsigned long long>(TileCountByLOD[LOD]),
LODReadySeconds[LOD]);
Streamer.Stop();
Streamer.DumpColdTimelineTrace();
bool bScreenSpaceGatePassing=true;