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
This commit is contained in:
1 parent
8805291d3e
commit
70c37aaab3
8 files changed
+681
-32
No files matched your search
@@ -0,0 +1,68 @@
|
||||
# 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`
|
||||
Reference in new issue
Block a user