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:
1 parent
97a1874498
commit
41b001b652
5 files changed
+481
-55
No files matched your search
+30
-10
@@ -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')
|
||||
|
||||
Reference in new issue
Block a user