measure(step1): cook is 1.5-2.3 ms, RMC's route is 8-11 s; CMC cannot take a field floor; cap 16 uploads

Rebuild plan step 1 (RESEARCH-SPEED-2026-09.md), all behind default-off switches.
A. Direct cook on a dedicated thread, 27-tile support cohort: core cook p50 1.50 ms, p95 2.28 ms;
   a 3,949-tri tile 1.67 ms extract+cook. PASSES the 10 ms gate. Through RMC's route the same
   support bodies became ready 8.46 s p50 / 10.80 s p95 after their meshes existed: FAILS 150 ms.
   Exact-target capsule sweep confirmed (0.75 ms after body update).
B. 100 rapid underfoot digs on CMC with a field override: 883 false-support frames, 0 false-air,
   0 invented velocity. CMC's floor comes from collision-scene traces -> step 4 = field-aware Mover.
C. 341 prequeued tiles, render on: cap 4 = 238 applies/s, cap 8 = 476, cap 16 = 639 (drain p95
   2.22 ms vs 2 ms gate); first visible 1 frame after release; no RT/RHI backlog. Tune drain,
   no grouping needed yet.
D. Same 128^3 region, 64/64 tile hashes equal in export and game. The "263 ns/sample" was export
   WALL time with 15 workers sharing a lattice (~3.4 us CPU/sample); game tile time includes
   meshing and duplicated borders (+22%); contention cap 1 vs 14: 74 vs 112 ms per tile.
   Profiling is not the cause.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-09-30 00:07:59 +02:00
1 parent 97a1874498
commit 41b001b652
5 files changed
+481 -55

No files matched your search

@@ -334,6 +334,10 @@ struct FExploreArguments
float RenderMaxDistanceVoxels = DefaultRenderMaxDistanceVoxels;
int32 ExportSize = DefaultExportSize;
int32 ExportStep = DefaultExportStep;
bool bExportTileOverride = false;
int32 ExportTileX = 0;
int32 ExportTileY = 0;
int32 ExportTileZ = 0;
// The canonical export owns one immutable lattice for the whole run. Batch cases can pass
// density_grid_reuse=false to produce a matched wall-clock control.
bool bReuseDensityGrid = true;
@@ -463,6 +467,24 @@ bool ParseArguments(const FString& Params, FExploreArguments& OutArguments, FStr
FParse::Value(*Params, TEXT("rendermaxdistance="), OutArguments.RenderMaxDistanceVoxels);
FParse::Value(*Params, TEXT("exportsize="), OutArguments.ExportSize);
FParse::Value(*Params, TEXT("exportstep="), OutArguments.ExportStep);
const bool bExportTileXSpecified = Params.Contains(
TEXT("exporttilex="), ESearchCase::IgnoreCase);
const bool bExportTileYSpecified = Params.Contains(
TEXT("exporttiley="), ESearchCase::IgnoreCase);
const bool bExportTileZSpecified = Params.Contains(
TEXT("exporttilez="), ESearchCase::IgnoreCase);
if (bExportTileXSpecified || bExportTileYSpecified || bExportTileZSpecified)
{
if (!bExportTileXSpecified || !bExportTileYSpecified || !bExportTileZSpecified
|| !FParse::Value(*Params, TEXT("exporttilex="), OutArguments.ExportTileX)
|| !FParse::Value(*Params, TEXT("exporttiley="), OutArguments.ExportTileY)
|| !FParse::Value(*Params, TEXT("exporttilez="), OutArguments.ExportTileZ))
{
OutError = TEXT("exporttilex, exporttiley, and exporttilez must be supplied together as level-0 tile coordinates.");
return false;
}
OutArguments.bExportTileOverride = true;
}
int32 DensityGridReuse = OutArguments.bReuseDensityGrid ? 1 : 0;
FParse::Value(*Params, TEXT("densitygridreuse="), DensityGridReuse);
OutArguments.bReuseDensityGrid = DensityGridReuse != 0;
@@ -2015,6 +2037,14 @@ FIntVector ChooseExploreMeshOrigin(
int32 MeshSize,
int32 TargetMiddleWorldZ)
{
if (Arguments.bExportTileOverride)
{
return FIntVector(
Arguments.ExportTileX * CHUNK_SIZE,
Arguments.ExportTileY * CHUNK_SIZE,
Arguments.ExportTileZ * CHUNK_SIZE);
}
FVector Centre(0.0f, 0.0f, static_cast<float>(TargetMiddleWorldZ));
if (CameraSeedWalk != nullptr && CameraSeedWalk->CameraSeedPoses.Num() > 0)
{