Far holes coexist with idle workers: far tiles wait median 1.12 s / p95 3.21 s from worker completion to apply while generating in p95 10 ms, so the game-thread result queue and admission are the limit. Priority split failed; 10 slots helped but broke the worst-tick bar. LOD2 still waits for far parents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
3.4 KiB
Linux 120 — arrival and far streaming
Decision
Keep the current scheduler defaults. Neither tested design meets the full bar. No production C++ change or version bump is retained.
Findings
-
Far holes can coexist with idle generation workers. In five UE 30 m/s runs, 575 of 2,153 scheduler samples with missing far tiles had zero generation workers running. In 497 of those 575 samples, completed results were queued. During movement, far tiles waited a median 1.12 s and p95 3.21 s from worker completion to apply; their generation time was p95 10 ms. The main wait is the game-thread result queue and scheduler admission, not expensive far-tile generation. The separate far-parent build also leaves the tile pool idle for 33–34 ms; see the L105 timeline.
-
Background priority is not tile preemption. VR mode assigns both near and horizon tile tasks
BackgroundLow; UE can defer queued background tasks, but a running tile finishes or is cancelled before another task takes its worker. The tested split (nearBackgroundNormal, horizonBackgroundLow) changed paired near-ready by only +0.01 points and increased far holes by 0.40 points. The scheduler already reserves an 80/20 near/far admission share during fast travel.Raising the existing worker cap from 8 to 10 effective tile slots improved paired UE moving near-ready by 1.10 points and reduced far holes by 0.48 points. Headless gains were +0.35 points and −0.41 points. This increases admitted work, not UE background threads (eight were available). The UE max tick reached 16.67 ms in one 10-slot run versus 15.43 ms in the 8-slot set, so the strict worst-tick gate failed.
-
LOD2 still depends on far parents.
LoadCoreTilerejects LOD2 while required far-world data is not ready. That data contributes to the density field LOD2 meshes sample. Removing the gate without proving a tile’s dependency set would change geometry. The far-world build is deferred until LOD0–1 are ready, so this dependency is on the arrival path. -
At 30 m/s, generation and result throughput limit near readiness. With the production ready-queue depth, LOD0–2 settled about 1.31 s after first admission. The 10-slot arrival pair improved near settlement by only 19 ms paired-median; whole-view/far-clear time changed by only 18 ms, within run variation, and both arms had zero far holes by 20 s. The larger depth-8 arrival gain does not represent the production default. At depth 8, the 10-slot movement trial did raise near-ready, but its worst UE tick failed the bar. Keep the cap unchanged.
Checks
- Five interleaved 30 m/s movement pairs per platform and five interleaved FI arrival pairs at default ready depth; quiet load stayed below 2.2 on 20 logical CPUs. UE used
tasksetonly; headless usedtasksetand the 6 GiB address-space limit. Each commandlet finished well under 30 minutes. - Fast tier: PASS, 274 checks / 80 runs, 267.1 s.
- Exact hashes: 24/24 PASS for SW/FI/TN/VS × Clang/GCC × W1/W8/W12; tile and whole-view hashes match the L104 baseline and Clang W1. Source stamp
f3ec37a…; no version bump is needed. - Unreal build passed with
-NoUBA -MaxParallelActions=4.git diff --checkis clean.
Detailed summaries and logs are under Saved/Linux/l120/; the movement and arrival comparisons are in movement/worker-slots-verified/summary.json, movement/priority-split-verified/summary.json, and arrival/pairs-rd64.json.