Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux120/REPORT.md
T
Fr0zkaandClaude Opus 5.5 161565936c research: arrival/far streaming study (L120, no production change)
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
2026-10-30 07:02:55 +01:00

3.4 KiB
Raw Blame History

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

  1. 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.

  2. 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 (near BackgroundNormal, horizon BackgroundLow) 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.

  3. LOD2 still depends on far parents. LoadCoreTile rejects 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.

  4. 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 taskset only; headless used taskset and 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 --check is 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.