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

+30 -10
View File
@@ -15,6 +15,9 @@ param(
[int]$HorizonLevel = 5,
[ValidateRange(1, 100000)]
[int]$HorizonRenderDistanceChunks = 768,
[ValidateSet(32, 64, 128)]
[int]$ParityExportSize = 128,
[string]$ParityExportTile = '',
[string]$SharedDDC
)
@@ -673,7 +676,7 @@ function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, [bool]$E
function New-CommandletArguments([string]$CommandletOut, [string]$Modes, [bool]$UseOwnerAssets,
[bool]$GameRuntimeConfig, [int]$ExportSize = 128,
[int]$Slot = 1) {
[int]$Slot = 1, [string]$ExportTile = '') {
$args = [System.Collections.Generic.List[string]]::new()
[void]$args.Add('-seed=0')
[void]$args.Add('-archetype=TunnelNetwork')
@@ -682,6 +685,14 @@ function New-CommandletArguments([string]$CommandletOut, [string]$Modes, [bool]$
[void]$args.Add('-blockearlyout=0')
[void]$args.Add('-densitygridreuse=1')
[void]$args.Add("-exportsize=$ExportSize")
if (-not [string]::IsNullOrWhiteSpace($ExportTile)) {
if ($ExportTile -notmatch '^\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*(-?\d+)\s*$') {
throw "-ParityExportTile must be three comma-separated level-0 tile coordinates: $ExportTile"
}
[void]$args.Add("-exporttilex=$($Matches[1])")
[void]$args.Add("-exporttiley=$($Matches[2])")
[void]$args.Add("-exporttilez=$($Matches[3])")
}
if ($GameRuntimeConfig) { [void]$args.Add('-gameconfig=1') }
if ($UseOwnerAssets) {
[void]$args.Add('-strateref=/Game/VoxelForge/DA_Strate3.DA_Strate3')
@@ -1108,11 +1119,17 @@ function Get-DigMotionMetrics([string]$LogPath) {
if ($result.Success -and $result.Groups['v'].Value -eq 'PASS') { $metrics.status = 'passed' }
foreach ($key in @('near_digs', 'near_frames', 'near_gate_frames', 'near_falling_frames',
'near_vertical_motion_frames', 'under_saw_falling', 'under_gate_frames',
'under_fall_cm', 'under_max_downward_velocity_cm_s')) {
'under_fall_cm', 'under_max_downward_velocity_cm_s', 'under_digs',
'first_frame_checks', 'support_observed_frames',
'false_support_frames', 'false_air_frames',
'invented_downward_velocity_events', 'field_override')) {
$match = [regex]::Match($line, ('{0}=(?<v>[^ ]+)' -f $key))
if (-not $match.Success) { continue }
if ($key -in @('near_digs', 'near_frames', 'near_gate_frames', 'near_falling_frames',
'near_vertical_motion_frames', 'under_saw_falling', 'under_gate_frames')) {
'near_vertical_motion_frames', 'under_saw_falling', 'under_gate_frames',
'under_digs', 'first_frame_checks', 'false_support_frames',
'support_observed_frames',
'false_air_frames', 'invented_downward_velocity_events', 'field_override')) {
$metrics[$key] = [int]$match.Groups['v'].Value
} else {
$metrics[$key] = [double]$match.Groups['v'].Value
@@ -1695,10 +1712,10 @@ try {
}
'parity' {
$parityArgs = New-CommonArguments 'commandlet' (Join-Path $RunRoot 'Logs\parity-commandlet.log') (Merge-Cvars $baseCvars)
# Use the same 128-voxel / 64-tile bounded region as the canonical exporter. The game
# harness streams a larger clipmap around its center; comparison is restricted to these
# exact level-0 tiles, including non-empty geometry rather than only an air tile.
$parityArgs += New-CommandletArguments $commandletOut 'export' $true $true 128 0
# Export one selected region size. The game harness streams a clipmap around its center;
# comparison is restricted to these exact level-0 tiles, including non-empty geometry.
$parityArgs += New-CommandletArguments $commandletOut 'export' $true $true `
$ParityExportSize 0 $ParityExportTile
$commandletLedger = Invoke-UnrealLaunch 'parity-commandlet' $parityArgs `
(Join-Path $RunRoot 'Logs\parity-commandlet.log') (Join-Path $RunRoot 'Logs\parity-commandlet.stdout.log') (Join-Path $RunRoot 'Logs\parity-commandlet.stderr.log')
$CommandletMetrics = Get-CommandletMetrics $commandletOut 'owner assets; game_runtime_config=1'
@@ -1707,13 +1724,15 @@ try {
$parityExport = Get-JsonValue $parityJson 'export'
$region = Get-JsonValue $parityExport 'region_origin_voxels'
if ($null -eq $region) { throw 'Parity commandlet did not report export.region_origin_voxels.' }
$paritySize = [int](Get-JsonValue $parityExport 'region_size_cells_per_axis' 128)
$paritySize = [int](Get-JsonValue $parityExport 'region_size_cells_per_axis' $ParityExportSize)
$centerOffset = [int]($paritySize / 2)
$centerX = [int]$region.x + $centerOffset
$centerY = [int]$region.y + $centerOffset
$centerZ = [int]$region.z + $centerOffset
$gameDump = Join-Path $RunRoot 'game_tile_hashes.json'
$baseCvars['voxel.TestExitSeconds'] = 15
if ($null -eq $Cvars -or -not $Cvars.Contains('voxel.TestExitSeconds')) {
$baseCvars['voxel.TestExitSeconds'] = 15
}
$baseCvars['voxel.StreamingTestCenterX'] = $centerX
$baseCvars['voxel.StreamingTestCenterY'] = $centerY
$baseCvars['voxel.StreamingTestCenterZ'] = $centerZ
@@ -1721,7 +1740,8 @@ try {
$baseCvars['voxel.UseBlockEarlyOut'] = 0
$baseCvars['voxel.OuterClassifierMode'] = 0
$baseCvars['voxel.SealedSolidProof'] = 0
$gameArgs = New-CommonArguments 'game' (Join-Path $RunRoot 'Logs\parity-game.log') (Merge-Cvars $baseCvars)
$gameArgs = New-CommonArguments 'game' (Join-Path $RunRoot 'Logs\parity-game.log') `
(Merge-Cvars $baseCvars) $EnableRender.IsPresent
$gameLedger = Invoke-UnrealLaunch 'parity-game' $gameArgs `
(Join-Path $RunRoot 'Logs\parity-game.log') (Join-Path $RunRoot 'Logs\parity-game.stdout.log') (Join-Path $RunRoot 'Logs\parity-game.stderr.log')
$GameMetrics = Get-StreamingMetrics (Join-Path $RunRoot 'Logs\parity-game.log')