skip: sound whole-tile proofs for legacy FI/TN/VS fields (L74); FI -30%, TN -22%
The compiled-analytic stratum interval now certifies a legacy tile uniform only when it stays beyond the detail envelope (and smooth-min slack for solid) with no intersecting primitive, edit, native field, composer candidate, passage or active transition; everything else fails closed. The stream layer uses the proof for whole-tile skips; legacy sub-tile skips stay off (two block proofs failed the falsifier in TN). Falsifier: full-grid reference vs skip-enabled run, identical mesh/payload/topology hashes on every tile of all four owner views, Clang and GCC, W1/W8/W12; 20-camera sweep per strate, 0 violations; a too-tight control changed 3/184/233/238 tiles and was caught. Whole view (8 workers): SW 2.61->2.48, FI 7.18->5.05, TN 5.97->4.63, VS 2.70->2.40 s. 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
bd1b2a8f1d
commit
c67b2006aa
15 files changed
+1024
-21
No files matched your search
@@ -39,6 +39,7 @@ namespace
|
||||
bool StreamPipeline=false;
|
||||
bool StreamHash=false;
|
||||
bool StreamHashTiles=false;
|
||||
bool StreamHashAllowUniformSkips=false;
|
||||
bool ProfileColumnOverlap=false;
|
||||
bool UseSharedColumnCache=true;
|
||||
bool ForceGenerate=false;
|
||||
@@ -1408,6 +1409,7 @@ namespace
|
||||
" --workers=N --clip-radius=N --max-clip-level=N --max-level=N\n"
|
||||
" --camera=X,Y,Z,YAW,PITCH (position in metres) --stream-hash\n"
|
||||
" --stream-hash-tiles (print per-tile hashes; implies --stream-hash)\n"
|
||||
" --stream-hash-tiles-allow-skips (mesh/topology falsifier with proven uniform skips)\n"
|
||||
" --camera-step=X,Y,Z (optional second view step in metres)\n"
|
||||
" --region-crossing (compile entering Core regions at the camera step)\n"
|
||||
" --column-cache=shared|thread-local (default: shared)\n"
|
||||
@@ -1489,6 +1491,8 @@ namespace
|
||||
else if(arg=="--stream-pipeline")options.StreamPipeline=true;
|
||||
else if(arg=="--stream-hash")options.StreamHash=true;
|
||||
else if(arg=="--stream-hash-tiles")options.StreamHash=true,options.StreamHashTiles=true;
|
||||
else if(arg=="--stream-hash-tiles-allow-skips")
|
||||
{options.StreamHash=true;options.StreamHashTiles=true;options.StreamHashAllowUniformSkips=true;}
|
||||
else if(arg=="--profile-column-overlap")options.ProfileColumnOverlap=true;
|
||||
else if(arg=="--force-generate")options.ForceGenerate=true;
|
||||
else if(arg=="--mesh-coverage")options.MeshCoverage=true;
|
||||
@@ -1657,9 +1661,10 @@ int main(int argc,char** argv)
|
||||
if(!ParseOptions(argc,argv,options))return 2;
|
||||
if(options.TlsProbeRequested)
|
||||
return StandaloneTlsProbe::Run(options.TlsProbeWorkers,options.TlsProbeTouch);
|
||||
std::printf("[HeadlessConfig] data=%s workers=%d clip_radius=%d max_clip_level=%d max_level=%d hash=%s column_overlap=%s force_generate=%s recipe=%s lattice_strate=%d shared_column_cache=%s camera_step_m=(%.3f,%.3f,%.3f) camera_override=%s camera_m=(%.6f,%.6f,%.6f) camera_rotation_deg=(%.3f,%.3f) seed_override=%s render_distance_override=%s\n",
|
||||
std::printf("[HeadlessConfig] data=%s workers=%d clip_radius=%d max_clip_level=%d max_level=%d hash=%s hash_uniform_skips=%s column_overlap=%s force_generate=%s recipe=%s lattice_strate=%d shared_column_cache=%s camera_step_m=(%.3f,%.3f,%.3f) camera_override=%s camera_m=(%.6f,%.6f,%.6f) camera_rotation_deg=(%.3f,%.3f) seed_override=%s render_distance_override=%s\n",
|
||||
options.DataPath.string().c_str(),options.WorkerCount,options.ClipRadius,options.MaxClipLevel,
|
||||
options.MaxLevel,options.StreamHash?"on":"off",options.ProfileColumnOverlap?"on":"off",
|
||||
options.MaxLevel,options.StreamHash?"on":"off",
|
||||
options.StreamHashAllowUniformSkips?"on":"off",options.ProfileColumnOverlap?"on":"off",
|
||||
options.ForceGenerate?"on":"off",options.CavesRecipe?"caves"
|
||||
:options.LatticeRecipe?"lattice"
|
||||
:options.FloatingIslandsRecipe?"floating-islands":"surface-world",
|
||||
@@ -2218,5 +2223,6 @@ int main(int argc,char** argv)
|
||||
options.ProofBlockCells,options.HasSignEdgeRepairOverride
|
||||
?options.ParallelSignEdgeRepair:options.FloatingIslandsRecipe,
|
||||
options.AuditNativeLattice,options.LatticeOrphanControl,
|
||||
options.CaptureSkipWalkability,options.ProfilePassageComposer);
|
||||
options.CaptureSkipWalkability,options.ProfilePassageComposer,
|
||||
options.StreamHashAllowUniformSkips);
|
||||
}
|
||||
@@ -1873,7 +1873,7 @@ namespace StandaloneStreamBenchmark
|
||||
bool bActiveLaneBatching=false,int32 ProofBlockCells=8,
|
||||
bool bParallelSignEdgeRepair=false,bool bAuditNativeLattice=false,
|
||||
bool bLatticeOrphanControl=false,bool bCaptureSkipWalkability=false,
|
||||
bool bProfilePassageComposer=false)
|
||||
bool bProfilePassageComposer=false,bool bAllowUniformSkipsWhenHashing=false)
|
||||
{
|
||||
using Clock=std::chrono::steady_clock;
|
||||
FStandaloneOwnerWorld& World=*OwnerWorld;
|
||||
@@ -2035,7 +2035,8 @@ namespace StandaloneStreamBenchmark
|
||||
std::printf("[CaptureWalkabilityGate] validation=deferred geometry_input=unchanged mode=mesh-export\n");
|
||||
FStandaloneStreamingGenerator Streamer(World,WorkerCount,bHashDensity,nullptr,MaxLevel,
|
||||
bSkipUvAndColors,bSkipMaterialGroups,bSkipUV,bSkipColors,&Shape,bProfileColumnOverlap,
|
||||
FarHorizonLOD8InteriorStepVoxels,bUseSharedColumnCache);
|
||||
FarHorizonLOD8InteriorStepVoxels,bUseSharedColumnCache,
|
||||
bAllowUniformSkipsWhenHashing);
|
||||
Streamer.SetUniformBlockProofAuditEnabled(bAuditUniformBlockProofs);
|
||||
Streamer.SetTileDrainInstrumentationEnabled(bInstrumentTileDrain);
|
||||
Streamer.SetPassageComposerProfilingEnabled(bProfilePassageComposer);
|
||||
|
||||
@@ -454,13 +454,15 @@ public:
|
||||
VoxelForgeCore::World* InCoreWorld=nullptr,
|
||||
bool bInCaptureColumnCoordinates=false,
|
||||
int32 InLod8HorizonInteriorStepVoxels=0,
|
||||
bool bInSharedColumnCache=true)
|
||||
bool bInSharedColumnCache=true,
|
||||
bool bInAllowUniformSkipsWhenHashing=false)
|
||||
:World(&InWorld),WorkerCount(FMath::Clamp(InWorkerCount,1,16)),bHashDensity(bInHashDensity),
|
||||
MeshCache(InMeshCache),MaxLevelFilter(InMaxLevelFilter),
|
||||
CoreWorld(InCoreWorld),bSkipUvAndColors(bInSkipUvAndColors),bSkipMaterialGroups(bInSkipMaterialGroups),
|
||||
bSkipUV(bInSkipUV),bSkipColors(bInSkipColors),
|
||||
bCaptureColumnCoordinates(bInCaptureColumnCoordinates),
|
||||
bSharedColumnCache(bInSharedColumnCache),
|
||||
bAllowUniformSkipsWhenHashing(bInAllowUniformSkipsWhenHashing),
|
||||
Lod8HorizonInteriorStepVoxels(std::max(0,InLod8HorizonInteriorStepVoxels))
|
||||
{
|
||||
VoxelGenLOD::InitializeConsoleSwitches();
|
||||
@@ -888,6 +890,7 @@ private:
|
||||
VoxelForgeCore::TileGenerationOptions Options;
|
||||
Options.bandMinZVoxel=Job.BandZMin;Options.bandMaxZVoxel=Job.BandZMax;
|
||||
Options.hashDensity=bHashDensity;
|
||||
Options.allowUniformSkipsWhenHashing=bHashDensity&&bAllowUniformSkipsWhenHashing;
|
||||
Options.skipUvAndColors=bSkipUvAndColors;
|
||||
Options.skipMaterialGroups=bSkipMaterialGroups;Options.skipUv=bSkipUV;Options.skipColors=bSkipColors;
|
||||
Options.captureColumnCoordinates=bCaptureColumnCoordinates;
|
||||
@@ -1185,6 +1188,7 @@ private:
|
||||
bool bSkipColors=false;
|
||||
bool bCaptureColumnCoordinates=false;
|
||||
bool bSharedColumnCache=true;
|
||||
bool bAllowUniformSkipsWhenHashing=false;
|
||||
int32 Lod8HorizonInteriorStepVoxels=0;
|
||||
bool bProfileMesherStages=false;
|
||||
bool bInstrumentTileDrain=false;
|
||||
|
||||
@@ -589,6 +589,7 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
EVoxelTileClass FirstUniformVerdict = EVoxelTileClass::Mixed;
|
||||
bool bAllRelevantBlocksUniform = true;
|
||||
bool bAllRelevantBlocksSame = true;
|
||||
bool bAllRelevantBlocksProofSafe = true;
|
||||
TArray<int32> MixedBlockIndices;
|
||||
|
||||
for (int32 BlockZ = 0; BlockZ < BlocksPerAxis; ++BlockZ)
|
||||
@@ -629,6 +630,7 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
EVoxelTileClass Verdict;
|
||||
bool bBlockUnknown = false;
|
||||
bool bBlockNative = false;
|
||||
bool bBlockProofSafe = false;
|
||||
if(ShapeWorldContext&&Step<=2)
|
||||
{
|
||||
const auto ShapeVerdict=ShapeWorldContext->ClassifyBoxDetailed(
|
||||
@@ -641,10 +643,14 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
?EVoxelTileClass::AllAir:EVoxelTileClass::Mixed;
|
||||
bBlockUnknown=ShapeVerdict.bUnknown;
|
||||
bBlockNative=ShapeVerdict.bNativeSurface;
|
||||
bBlockProofSafe=ShapeVerdict.bSkipSafe;
|
||||
if((Verdict==EVoxelTileClass::AllSolid
|
||||
||Verdict==EVoxelTileClass::AllAir)
|
||||
&&(!bBlockNative||bBlockUnknown))
|
||||
&&!bBlockProofSafe)
|
||||
{
|
||||
bCanSkipProofBlockGrid=false;
|
||||
bAllRelevantBlocksProofSafe=false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -729,7 +735,7 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
if (Verdict == EVoxelTileClass::AllSolid
|
||||
|| Verdict == EVoxelTileClass::AllAir)
|
||||
{
|
||||
if(OutBlockProofAudit&&Step<=2&&bBlockNative)
|
||||
if(OutBlockProofAudit&&Step<=2&&bBlockProofSafe)
|
||||
{
|
||||
++OutBlockProofAudit->CheckedBlocks;
|
||||
const int32 ProofMinX=BlockX*BlockCells-1;
|
||||
@@ -777,7 +783,7 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
}
|
||||
if (Verdict == EVoxelTileClass::Mixed)
|
||||
{
|
||||
if(OutBlockProofAudit&&Step==2)
|
||||
if(OutBlockProofAudit&&Step<=2)
|
||||
{
|
||||
++OutBlockProofAudit->FallbackBlocks;
|
||||
if(bBlockUnknown)++OutBlockProofAudit->UnknownBlocks;
|
||||
@@ -785,6 +791,12 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
MixedBlockIndices.Add(
|
||||
((BlockZ * BlocksPerAxis) + BlockY) * BlocksPerAxis + BlockX);
|
||||
}
|
||||
else if(OutBlockProofAudit&&Step<=2&&!bBlockProofSafe)
|
||||
{
|
||||
// A midpoint or other non-interval verdict is only a candidate;
|
||||
// it is not counted as a certified hit in the statistical sweep.
|
||||
++OutBlockProofAudit->FallbackBlocks;
|
||||
}
|
||||
if (Verdict == EVoxelTileClass::AllSolid
|
||||
|| Verdict == EVoxelTileClass::AllAir)
|
||||
{
|
||||
@@ -884,6 +896,7 @@ FVoxelMeshData UVoxelMarchingCubesMesher::GenerateMesh(FIntVector OriginVoxels,
|
||||
// allocating the density grid; no samples are skipped for a tile that can contain
|
||||
// geometry, and the final geometry remains byte-identical because this path emits none.
|
||||
if (bHaveUniformBlock && bAllRelevantBlocksSame && bAllRelevantBlocksUniform
|
||||
&& bAllRelevantBlocksProofSafe
|
||||
&& !(Step == 2 && OutDebugDensitySamples != nullptr)
|
||||
&& !(bForceFullDensityCapture && OutDebugDensitySamples != nullptr))
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user