diag: passage vs boundary-band ceiling split (L88); coarse passage cache rejected
Verified ablations (zero passage work / zero band calls). LOD0-2 @W12: exact FI 2.27 / TN 2.25 s; passages off FI 0.81 / TN 0.85; bands off FI 2.11 / TN 2.06. Passages cost ~1.4-1.6 s of near readiness, bands ~0.1-0.2 s. A tile-local 4-voxel trilinear passage-delta cache increased carve segment visits (FI 34.5M -> 56.2M) and slowed LOD0-2 (FI 2.58 -> 3.77 s); removed. No world change. 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
0fe7f371f7
commit
fa78192c86
5 files changed
+287
-17
No files matched your search
@@ -31,19 +31,37 @@
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
|
||||
// L86-only ceiling measurement. This removes passage carving/support and the transition-mouth
|
||||
// passage fade so timing can measure the best possible passage-representation gain. Never ship
|
||||
// or expose this diagnostic as a world setting.
|
||||
static bool VF_IsL86PassageCompositionDisabled()
|
||||
// L88-only composition split. These switches let the timing harness remove passage work and
|
||||
// resolved boundary-band work independently. They are diagnostic only, never world settings.
|
||||
static bool VF_IsL88DiagnosticSwitchEnabled(const char* Name)
|
||||
{
|
||||
static const bool bDisabled = []()
|
||||
{
|
||||
const char* Value = std::getenv("VOXELFORGE_L86_DISABLE_PASSAGE_COMPOSITION");
|
||||
return Value && Value[0] == '1' && Value[1] == '\0';
|
||||
}();
|
||||
const char* Value=std::getenv(Name);
|
||||
return Value&&Value[0]=='1'&&Value[1]=='\0';
|
||||
}
|
||||
|
||||
static bool VF_IsL88PassageCompositionDisabled()
|
||||
{
|
||||
static const bool bDisabled=VF_IsL88DiagnosticSwitchEnabled(
|
||||
"VOXELFORGE_L88_DISABLE_PASSAGES")
|
||||
||VF_IsL88DiagnosticSwitchEnabled("VOXELFORGE_L86_DISABLE_PASSAGE_COMPOSITION");
|
||||
return bDisabled;
|
||||
}
|
||||
|
||||
static bool VF_IsL88BoundaryBandsDisabled()
|
||||
{
|
||||
static const bool bDisabled=VF_IsL88DiagnosticSwitchEnabled(
|
||||
"VOXELFORGE_L88_DISABLE_BOUNDARY_BANDS")
|
||||
||VF_IsL88DiagnosticSwitchEnabled("VOXELFORGE_L86_DISABLE_PASSAGE_COMPOSITION");
|
||||
return bDisabled;
|
||||
}
|
||||
|
||||
static bool VF_IsL88AllowPassageAblationWalkabilityFailure()
|
||||
{
|
||||
static const bool bEnabled=VF_IsL88DiagnosticSwitchEnabled(
|
||||
"VOXELFORGE_L88_ALLOW_PASSAGE_ABLATION_WALKABILITY_FAILURE");
|
||||
return bEnabled;
|
||||
}
|
||||
|
||||
// Standalone-only world compiler. It compiles the runtime room/tunnel/passages into
|
||||
// axis-line intervals, composes rock/cave signs into packed Z-column words, then displaces
|
||||
// only the conservative surface band. The copied Unreal generator remains the A/B reference.
|
||||
@@ -197,7 +215,6 @@ public:
|
||||
std::ptrdiff_t first=-1,end=-1;
|
||||
std::vector<std::uint8_t> activeNodes;
|
||||
};
|
||||
|
||||
FScopedPassageTileQueries(const FStandaloneShapeWorld& shape,
|
||||
const std::array<std::int64_t,3>& minimumSubvoxels,
|
||||
const std::array<std::int64_t,3>& maximumSubvoxels,
|
||||
@@ -208,7 +225,9 @@ public:
|
||||
{
|
||||
mayContainResolvedBoundaryBand_=shape.ResolvedBoundaryBandsIntersectSubvoxelRange(
|
||||
minimumSubvoxels_[2],maximumSubvoxels_[2]);
|
||||
const bool disablePassageComposition = VF_IsL86PassageCompositionDisabled();
|
||||
const bool disablePassageComposition=VF_IsL88PassageCompositionDisabled();
|
||||
const bool disableBoundaryBands=VF_IsL88BoundaryBandsDisabled();
|
||||
if(disableBoundaryBands)mayContainResolvedBoundaryBand_=false;
|
||||
mayContainTransitionPassageFade_ = !disablePassageComposition
|
||||
&& shape.ResolvedTransitionPassageFadeIntersectsTileXY(
|
||||
minimumSubvoxels_, maximumSubvoxels_);
|
||||
@@ -930,6 +949,9 @@ public:
|
||||
#endif
|
||||
(void)X;(void)Y;
|
||||
const auto* tileQueries=ActivePassageTileQueries;
|
||||
if(tileQueries&&tileQueries->matches(*this))
|
||||
if(auto* profile=tileQueries->profileStats())
|
||||
++profile->resolvedBoundaryBandQueries;
|
||||
if(tileQueries&&tileQueries->matches(*this))
|
||||
{
|
||||
if(!tileQueries->mayContainResolvedBoundaryBand())
|
||||
@@ -2256,9 +2278,11 @@ public:
|
||||
// mouth that crosses a wide transition band. Keep that opt-in field whole;
|
||||
// its host-rock value already supplies the ceiling and bedrock.
|
||||
const bool disablePassageComposition=!nativeLattice
|
||||
&&VF_IsL86PassageCompositionDisabled();
|
||||
&&VF_IsL88PassageCompositionDisabled();
|
||||
const bool disableBoundaryBands=!nativeLattice
|
||||
&&VF_IsL88BoundaryBandsDisabled();
|
||||
float boundary=graphDensity;
|
||||
if(!nativeLattice&&!disablePassageComposition)
|
||||
if(!nativeLattice&&!disableBoundaryBands)
|
||||
{
|
||||
VoxelForgeCore::Linux77Profiler::FScopedPhase l77BandsPhase(
|
||||
VoxelForgeCore::Linux77Profiler::EPhase::Bands);
|
||||
@@ -3019,10 +3043,21 @@ public:
|
||||
// Route validation is world-wide. Detail regions reuse the same authored route data and
|
||||
// do not need to repeat the 5,642-point world audit for every entering tile group.
|
||||
Substage=Clock::now();
|
||||
if(bValidatePassageRoutes&&!ValidatePassageRoutes())
|
||||
const bool bPassageRoutesValid=!bValidatePassageRoutes||ValidatePassageRoutes();
|
||||
if(!bPassageRoutesValid)
|
||||
{
|
||||
Error="compiled shape world contains a solid passage centreline sample";
|
||||
return false;
|
||||
if(VF_IsL88PassageCompositionDisabled()
|
||||
&&!VF_IsL88BoundaryBandsDisabled()
|
||||
&&VF_IsL88AllowPassageAblationWalkabilityFailure())
|
||||
{
|
||||
std::printf("[L88PassageAblation] route walkability failed as expected; "
|
||||
"continuing only to measure passage-off/bands-on readiness\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
Error="compiled shape world contains a solid passage centreline sample";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Stats.PassageValidationSeconds=std::chrono::duration<double>(Clock::now()-Substage).count();
|
||||
Built=true;
|
||||
|
||||
Reference in new issue
Block a user