Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux92/REPORT.md
T
Fr0zkaandClaude Opus 5.5 70c37aaab3 unreal: startup boost spans epoch churn; empty collision tiles stay classified (L92)
- Startup apply boost (24 meshes / 14 ms) now ends on initial LOD0-2 + collision readiness or
  the 30 s timeout, not on the first desired-epoch change: FI LOD0-2 settled 3.49 -> 3.40 s.
- Known-empty LOD0 collision classifications persist across unloads within a modification epoch
  and are invalidated on edits; commandlet readiness accepts CollisionNotRequired tiles. The 30 m/s
  movement trace now passes (no re-requests of the 4 support tiles).
- Startup trace events: SerializeResolvedWorld ~466 ms synchronous in BeginPlay (unchanged);
  SW bReady at 2.74 s vs FI 0.75 s (to investigate). Redundant second parse removed.
- Core output identical. Fast tier PASS; Linux UE builds. R42 notes attached.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
2026-10-28 06:54:59 +01:00

69 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Linux 92 report
## Startup timing
All Unreal runs were pinned to CPUs 0–11 and had no address-space limit. Medians below use three runs per row. `LOD0–2 settled` means every currently desired LOD0–2 key was in `LoadedTiles` or `CollisionNotRequiredTiles`.
| Stratum | Measure | Before | Final | Runs |
|---|---|---:|---:|---:|
| FI | Snapshot serialization | 491.8 ms | 465.6 ms | 3 / 3 |
| FI | `FromJson` | 20.0 ms | 18.9 ms | 3 / 3 |
| FI | Compile launch | 0.608 s | 0.569 s | 3 / 3 |
| FI | `bReady` | 0.764 s | 0.750 s | 3 / 3 |
| FI | BeginPlay end | 0.609 s | 0.570 s | 3 / 3 |
| FI | First admission | 0.780 s | 0.762 s | 3 / 3 |
| SW | Snapshot serialization | 465.1 ms | 468.0 ms | 3 / 3 |
| SW | `FromJson` | 18.9 ms | 19.3 ms | 3 / 3 |
| SW | Compile launch | 0.575 s | 0.581 s | 3 / 3 |
| SW | `bReady` | 2.738 s | 2.738 s | 3 / 3 |
| SW | BeginPlay end | 0.577 s | 0.582 s | 3 / 3 |
| SW | First admission | 2.751 s | 2.747 s | 3 / 3 |
The final FI first-admission times were 0.761, 0.762 and 0.802 s. SW was 2.795, 2.747 and 2.632 s. These are measured timings; the small before/after differences are not a defensible 0.7 s saving. The exporter still runs synchronously in BeginPlay and measured 466 ms FI / 468 ms SW. Attribution of that time to asset reflection and Core assembly preparation is an inference; the trace measures the enclosing `SerializeResolvedWorld` call.
I removed a redundant second parse in `ResolvedWorldSnapshot::FromJson`. Its measured stage stayed around 19 ms, so this cleanup did not materially move first admission. The serialization/parse/compile/bReady trace events are in `Saved/Linux/l92/unreal-arrival/*.trace.jsonl`.
Core output stayed identical: world assembly `1ecc162755ab83ac`, recipe `52b010081ad4b550`, plan `a06d76fd11d7a08e`.
## LOD0–2 arrival
Times are seconds from BeginPlay start. Before runs used the old `LoadedTiles` count; final runs use the settled predicate above.
| Stratum | Before, boost on | Final, boost on | Median before → final |
|---|---|---|---:|
| FI | 3.464, 3.632, 3.588 | 3.396, 3.395, 3.419 | 3.588 → 3.396 s |
| SW | 5.072, 5.183, 5.063 | 5.198, 9.256, 5.060 | 5.072 → 5.198 s |
The LOD result improves for FI and has a long SW tail. Baseline SW commandlets exited 1 because readiness rejected `CollisionNotRequired` tiles; all final boost-on SW commandlets exited 0 with the aligned predicate.
## Startup apply boost A/B
The 24-apply / 14 ms boost now spans desired-epoch churn and ends on initial LOD0–2 plus collision-set readiness, or the existing 30 s timeout. All boost-on traces ended on readiness. It remained active 2.2–2.5 s in FI and 2.2–6.4 s in SW.
| Stratum | Boost on | Boost off | Readout |
|---|---|---|---|
| FI | 3.396, 3.395, 3.419 s (median 3.396) | 3.490, 3.681, 3.460 s (median 3.490) | 94 ms faster on |
| SW | 5.198, 9.256, 5.060 s (median 5.198) | 5.053, incomplete, 5.045 s | No demonstrated gain; one off run did not fully settle by 20 s |
## Empty collision cache and movement
Known-empty LOD0 classifications persist across unloads within the current modification epoch, are restored on desired-set rebuilds, and are cleared for affected tiles in both modification paths. The commandlet readiness checks now accept `LoadedTiles` or `CollisionNotRequiredTiles` and separately require the collision desired set to settle.
The policy-3 30 m/s Unreal trace passed: process and Core world test exited 0, with 46 moving samples and 105 dwell samples. Moving means were 5.568% far holes and 24.709% near readiness; dwell ended at 0% far holes and 100% near readiness. For each target key `(47,-2,-99..-102)`, the trace logged one empty classification, one request/tile result and one unload-preserve event; there were no repeated tile requests. The Core edit integration test passed. No cached-empty key was edited in these traces, so runtime `tile_data_changed` invalidation was not observed; that path is wired and per-key traced in source.
## Builds, verification and failed runs
- Final Linux UE build succeeded with `-NoUBA -MaxParallelActions=4`, pinned to CPUs 0–11, without `--as`. Log: `Saved/Linux/l92/unreal-build-final-direct-json.log`.
- Final fast tier passed: 274 checks in 288.4 s. Headless build and verification were pinned to CPUs 0–11 and limited to 6 GiB. Logs: `Saved/Linux/l92/fast-build-final.log`, `Saved/Linux/l92/fast-tier-final.log`.
- The first fast-tier launch stopped immediately because its stamped binary was missing; the built-binary rerun passed.
- Baseline SW commandlets failed the old readiness predicate despite usable arrival samples. One initial SW trace also reached movement before full residency; it was rerun with a 20 s hold. The final SW boost-off repeat 2 remained two LOD0 tiles short at the hold boundary and is reported as incomplete, not assigned an arrival time.
- A temporary route-candidate prefilter produced a much shorter export trace, but it touched passage route planning. It was removed; those timings are excluded. The final worktree does not modify the passage composer.
- No run exceeded 30 minutes. No commit, push or stash was made.
## Source files
- `Source/VoxelForge/Private/VoxelWorld.cpp`
- `Source/VoxelForge/Public/VoxelWorld.h`
- `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp`
- `Standalone/Core/src/VoxelForgeCore.cpp`