The 50-90 ms UWorld::Tick spikes were the TG_EndPhysics barrier waiting for physics-scene completion while all 8 TaskGraph workers ran BackgroundHigh tile tasks. Near and horizon tile generation now run at ETaskPriority::BackgroundLow (helper lanes background); queue depth and the 8 workers are kept. FI: near set 2.11 s (10 runs), max UWorld::Tick 21 ms, max EndPhysics->PostPhysics gap 16 ms; SW: 1.32 s, 11 ms. A hard 7-task cap removed spikes but doubled settle time. World unchanged. Fast tier PASS; Linux UE host builds. R44 notes (exact passage restructuring: only a full-composer z-column SIMD kernel could plausibly reach 3x; smaller exact pieces ~1.1-1.2x each) attached. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
3.4 KiB
Linux L97 — arrival tick stalls
Stall
Measured: FI control runs had 54.1 ms and 93.4 ms UWorld::Tick spikes while AVoxelWorld::Tick took 1.7 ms and 1.3 ms. Eight tile workers were active. Text tick.LogTicks output put 52 ms and 92 ms between releasing TG_EndPhysics and TG_PostPhysics; the group 3 log names FEndPhysicsTickFunction.
Engine source: LevelTick.cpp blocks on TG_EndPhysics. FEndPhysicsTickFunction in PhysLevel.cpp holds its completion event on PhysScene->GetCompletionEvents() and then runs FinishPhysicsSim. Thus the measured wait is the EndPhysics barrier waiting for physics-scene completion. Inferred cause: near tile tasks at BackgroundHigh, plus their helper lanes, delay that completion work when the shared worker pool is full. Lowering helper priority alone did not remove the spikes. The exact Chaos completion task was not available: L96's .utrace export failed to start Insights on SDL/UDEV, so L97 used Unreal's text tick logger instead.
Fix and measurements
Set near and horizon tile generation to UE::Tasks::ETaskPriority::BackgroundLow; keep Core ParallelFor helper lanes background-prioritized. Keep the existing refill queue (CVar 64, effective depth 32) and all 8 background workers. This changes scheduling only; generation inputs and output are unchanged.
| Configuration | FI: median near-set / max UWorld::Tick |
SW: median near-set / max UWorld::Tick |
|---|---|---|
| Existing near-high priorities, 5 runs each | 2.338 s / 93.4 ms | 1.298 s / 11.2 ms |
| Helper lanes background only, 5 each | 2.318 s / 71.9 ms | 1.547 s / 11.1 ms |
| Hard cap 7 tasks, refill queue 0, 5 each | 4.169 s / 7.2 ms | 4.422 s / 10.8 ms |
All tile tasks BackgroundNormal, 5 each |
2.337 s / 240.0 ms | 1.301 s / 13.3 ms |
Selected: all tile tasks BackgroundLow, 10 FI / 5 SW |
2.109 s / 21.0 ms | 1.316 s / 11.0 ms |
The selected FI near-set range was 2.075–2.611 s (three of ten runs exceeded 2.3 s); SW was 1.285–1.323 s. In the selected runs, the largest EndPhysics-to-PostPhysics gap was 16 ms FI and 7 ms SW. A one-worker reserve with CVar depth 64 (effective depth 28) still ran 8 workers and reached 107.9 ms FI; setting the queue to zero enforced a true 7-task cap but caused 4.2–4.4 s settle times. The selected configuration's enclosing harness interval peaked at 37.0 ms, with 16.0 ms outside UWorld::Tick; the largest UWorld::Tick was 21.0 ms.
Fast tier: PASS, 269 passing checks and 5 diagnostic-only baseline comparisons. Final Linux UE build passed with -NoUBA -MaxParallelActions=4. Logs and per-run summaries are under Saved/Linux/l97/.
Files
Source/VoxelForge/Private/VoxelWorld.cppStandalone/Research/WorldAssemblerM3/Linux97/RunL97UnrealArrival.py- Engine references only (not modified):
Engine/Source/Runtime/Engine/Private/LevelTick.cpp,Engine/Source/Runtime/Engine/Private/PhysicsEngine/PhysLevel.cpp,Engine/Source/Runtime/Engine/Private/TickTaskManager.cpp.
Failed attempts
- One early repeat requested reserve 0/helper priority off, but CVar startup readback used defaults; excluded. A
--phase diagnosticinvocation was invalid and rerun withprobe. - The first fast-tier attempt used the stale default
l42executable. Rebuilt an L97 Clang headless binary and reran successfully. - No L97
.utracedecode; Insights export had the SDL/UDEV startup failure recorded in L96. No installs, commits, pushes, or stashes.