fix(mesher): stop forcing the nested block classifier on -- but I cannot reproduce the 3.5x
The code contradicted its own documentation. VoxelMarchingCubesMesher.h:150 says to leave
the optional 8^3-block refinement DISABLED in streaming, "repeating a proof on ..." --
and VoxelWorld.cpp forced `Mesher->bUseBlockEarlyOut = true` regardless.
It is now off by default, behind `voxel.UseBlockEarlyOut` (CVar + command line), so the
capability stays available for the focused diagnostics where it was measured to help.
⚠️ THE HEADLINE NUMBER DOES NOT REPRODUCE, AND I AM NOT CLAIMING IT
Sol's second pass read a 3.5x from the attribution table:
classifier disabled 587.991 ms
classifier enabled 2,056.596 ms
My own clean A/B on this flag, quiet machine, 3 runs each:
nested OFF 0.597 / 0.613 / 0.607 s mean 0.606
nested ON 0.637 / 0.599 / 0.605 s mean 0.614
Identical within noise.
So either the 2,056 ms control exercised more than this flag does, or the 3.5x lives on
a path the 128^3 export does not take. PERF-ATTRIBUTION.md describes that figure as "the
separate classifier control", which is not obviously the same lever. Until the game-path
A/B is run, treat the 3.5x as UNCONFIRMED.
What this commit is worth on its own: the code now does what its documentation says, the
behaviour is switchable rather than hardcoded, and geometry is unchanged --
SHA-256 b3e5f4c3..9b377 identical with the flag on, off, and against bb8ec51.
⚠️ An earlier measurement pass in this round was contaminated: a local llama-server was
using 5 GB and competing for cores. Those runs came out 0.67-0.78 s with the on/off
ranges overlapping. Discarded and re-measured on a quiet machine; only the clean numbers
above are reported. Worth recording as a reminder that the machine is part of the
instrument.
NOT DONE -- the round was OOM-killed partway (same llama-server):
- the three-way outer-classifier A/B (no outer / current+discarded validation / ⭐ outer
with validation samples REUSED as the mesher core grid). That third mode is the
interesting one: exact validation currently costs 33^3 = 35,937 density calls whose
results are then DISCARDED, while the mesher then fills 35^3 = 42,875. A successful
uniform verdict saves at most 16.18%, and a Mixed verdict saves nothing.
- game-path measurement of any of it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aheo2crrZmHuYtPpdY2Cb
This commit is contained in:
1 parent
bb8ec51939
commit
f2044135ea
4 files changed
+224
-15
No files matched your search
@@ -107,6 +107,11 @@ struct FChunkResult
|
||||
uint64 GenerationEndCycles = 0;
|
||||
uint64 ApplyStartCycles = 0;
|
||||
int32 ClassifyVerdict = -1; double ClassifySeconds = 0.0; double MeshSeconds = 0.0; double StreamSeconds = 0.0; int32 NumTriangles = 0;
|
||||
// Clean, low-overhead work counters. These are carried with the result so the worker can
|
||||
// count exact validation and mesher density calls locally, then publish one aggregate update.
|
||||
int64 ValidationDensityCalls = 0;
|
||||
int64 MesherDensityCalls = 0;
|
||||
bool bValidationCoreReused = false;
|
||||
bool bAborted = false; // Worker observed shutdown or cancellation; never mark this tile loaded
|
||||
bool bObsolete = false; // Worker observed per-tile desired-set cancellation
|
||||
uint32 DesiredEpoch = 0; // Desired-set epoch captured at request time
|
||||
@@ -915,6 +920,19 @@ public:
|
||||
int32 ObsoleteTileAbortCount = 0; // cumulative per-world moving-session cancellation count
|
||||
float PeakObservedPawnSpeedCmPerSecond = 0.0f;
|
||||
|
||||
// Clean performance accounting. LOD 0..8 covers every marching-cubes clip level; sheet tiles
|
||||
// above the configured MC range never enter the outer classifier.
|
||||
static constexpr int32 TrackedClassifierLODCount = 9;
|
||||
std::atomic<uint64> TotalWorkerGenerationCycles{0};
|
||||
std::atomic<uint64> TotalWorkerGenerationTasks{0};
|
||||
std::atomic<uint64> TotalObsoleteWorkerCycles{0};
|
||||
std::atomic<uint64> TotalObsoleteWorkerTasks{0};
|
||||
std::atomic<uint64> TotalValidationDensityCalls{0};
|
||||
std::atomic<uint64> TotalMesherDensityCalls{0};
|
||||
std::atomic<uint64> TotalValidationCoreReuseTiles{0};
|
||||
std::atomic<uint64> OuterClassifierCallsByLOD[TrackedClassifierLODCount]{};
|
||||
std::atomic<uint64> OuterClassifierVerdictsByLOD[TrackedClassifierLODCount][3]{};
|
||||
|
||||
struct FStreamingLatencySample
|
||||
{
|
||||
double RequestToReadySeconds = 0.0;
|
||||
|
||||
Reference in new issue
Block a user