streaming: split dense passage-junction grid fills; heavy-first order + far-parent deferral in Unreal (L85)

Tiles with passage-overlap score >= 9 split grid fill over up to 4 helper lanes (disjoint rows,
same per-sample order, join before MC) when workers are idle. FI junction tile fill 173 -> 99 ms;
estimated serial floor ~0.55-0.60 s. Readiness essentially unchanged (FI/TN LOD0-2 ~2.15 s @W12):
the limit is now aggregate work, not single tiles.
Unreal: LOD0-2 ordered by passage overlap before travel/distance (L80 modes kept); far parents
built after LOD0-1, LOD2 gated on them; helper budget via ParallelFor. Unreal null-RHI FI
arrival: LOD0-2 resident at 3.65 s.
All tile hashes identical to L84 (four whole views). 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-28 02:02:32 +01:00
1 parent 0a98da6fd0
commit 06f558dc91
17 files changed
+1561 -54

No files matched your search

+22 -1
View File
@@ -271,11 +271,32 @@ public:
}
ActivePassageTileQueries=this;
}
// Duplicate the immutable per-tile masks onto a density-grid helper worker. Mutable
// segment-range caches remain lane-local so helpers never race with the parent query.
explicit FScopedPassageTileQueries(const FScopedPassageTileQueries& source)
:shape_(source.shape_),minimumSubvoxels_(source.minimumSubvoxels_),
maximumSubvoxels_(source.maximumSubvoxels_),featureIndices_(source.featureIndices_),
stampIndices_(source.stampIndices_),cavernFeatureIndices_(source.cavernFeatureIndices_),
passageRoutes_(source.passageRoutes_),passageColumns_(source.passageColumns_),
passageMouthSupports_(source.passageMouthSupports_),
passageMouthSupportSegments_(source.passageMouthSupportSegments_),
passageSegmentRangeCaches_(source.passageSegmentRangeCaches_.size()),
upperMouthSupportPassages_(source.upperMouthSupportPassages_),
routeSegmentCandidateCount_(source.routeSegmentCandidateCount_),
routeFeatureOverlap_(source.routeFeatureOverlap_),columnZOverlap_(source.columnZOverlap_),
mayContainResolvedBoundaryBand_(source.mayContainResolvedBoundaryBand_),
mayContainTransitionPassageFade_(source.mayContainTransitionPassageFade_),
previous_(ActivePassageTileQueries)
{ ActivePassageTileQueries=this; }
~FScopedPassageTileQueries(){ActivePassageTileQueries=previous_;}
FScopedPassageTileQueries(const FScopedPassageTileQueries&)=delete;
FScopedPassageTileQueries& operator=(const FScopedPassageTileQueries&)=delete;
bool matches(const FStandaloneShapeWorld& shape) const{return shape_==&shape;}
static const FScopedPassageTileQueries* CurrentFor(const FStandaloneShapeWorld& shape)
{
const FScopedPassageTileQueries* current=ActivePassageTileQueries;
return current&&current->shape_==&shape?current:nullptr;
}
bool hasFeature(std::size_t passageIndex,bool columnFeature) const
{
const auto& candidates=columnFeature?passageColumns_:passageRoutes_;