fix(diagnostics): keep UI scripts on game-loop time

Preserve sub-millisecond frame deltas with a command-local compensated clock so uncapped diagnostic routes do not outrun materialization and settling. Keep sleep boundaries inclusive, wait timeouts strict, and handle long-duration and invalid-delta cases deterministically.

Record the aligned seven-destination connected route with a full turn at every stop. Release build succeeds and all 6,308 tests pass with five intentional skips.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-19 16:38:49 +02:00
parent 3718e341be
commit b95bb3e21c
4 changed files with 336 additions and 15 deletions

View file

@ -126,18 +126,51 @@ stable radix, avoiding a second immediate-buffer pack for deferred transparent
instances, packing per-instance light sets, caching static picking descriptors,
and using checked direct group handles. Historical material groups now retire
after one complete unused frame (not after one `Draw`, because landscape slices
and paperdoll share the dispatcher) and release their list capacity. That dense
sample reached roughly 5.36.2 ms CPU / 7.18.3 ms p95 and 3.23.6 ms GPU before
the final group-retirement review correction.
and paperdoll share the dispatcher) and release their list capacity. Before the
final group-retirement review correction, that fixed dense sample reached
5.36.2 ms CPU p50, 7.18.3 ms CPU p95, and 3.23.6 ms GPU p50.
The earlier software limiter also used coarse `Thread.Sleep`, whose nominal
one-millisecond waits measured about 15.98 ms on this host. A reusable Windows
high-resolution waitable timer now paces to the monitor deadline and is reported
as `pace` by the frame profiler. Scripted UI automation no longer enables the
allocation-heavy GPU-stream dump implicitly, and graceful shutdown now wakes
all persistent mesh workers without resetting their shared wake signal. The
post-review connected stress rerun remains pending because local ACE was not
listening; sparse-scene 239 FPS samples are not substituted for that gate.
all persistent mesh workers without resetting their shared wake signal. The UI
automation clock now uses command-local compensated accumulation, retaining
sub-millisecond frame deltas instead of rounding every uncapped frame up to one
millisecond. Exact sleep and strict timeout boundaries therefore remain stable
across high-refresh frames and long scripts.
The post-review connected rerun passed on 2026-07-19. It used the complete
Caul → Sawato → Rynthid → Aerlinthe → Sawato → Holtburg → Caul route, waited for
each actual materialization, allowed at least five seconds of destination
streaming, synchronized to the next profiler boundary, and then held the retail
turn-right action through one dedicated interval (4.935.07 seconds, more than
one full visibility sweep) at every stop. Each
turn window and its following stationary window were captured on separate
profiler boundaries. The uncapped Release client completed all seven portals
and seven turns and shut down gracefully, with no exception, WER report, or AMD
driver reset observed in the process logs, Windows event logs, or crash-dump
directory. Returned dense Caul contained about 21,024 visible entities and
measured 3.8 ms median / 5.0 ms p95 CPU and 2.6 ms median / 3.2 ms p95 GPU while
stationary (241 FPS in the title sample). Its complete turning window measured
3.0 ms median / 4.9 ms p95 CPU and 2.0 ms median / 3.4 ms p95 GPU.
Across all stationary destinations, CPU p50/p95 ranged from 1.14.0 /
1.65.1 ms and GPU p50/p95 from 0.72.8 / 1.03.4 ms. Across the turn
windows, those ranges were 1.03.1 / 1.84.9 ms CPU and
0.72.0 / 1.23.4 ms GPU. Working/private memory was 939.8/1,438.3 MiB on the
first Caul dwell; the highest stationary sample was 1,065.0/1,660.6 MiB in
Holtburg, followed by 1,034.8/1,630.5 MiB on the Caul return. The samples were
non-monotonic, but one circuit is not claimed as a new lifetime plateau proof.
Startup reached a transient 240.2 ms maximum, and the largest later
destination-load window reached 81.9 ms CPU; all isolated turn and stationary
windows recovered to low-millisecond frame times, so this run is not described
as stall-free.
The run was performed over RDP, but software pacing was explicitly disabled and
`pace` remained zero, so these are engine-throughput measurements rather than
remote-display refresh measurements. The lifestone/particle visual gate remains.
**Files:** `src/AcDream.App/Rendering/RetailAlphaQueue.cs`;
`src/AcDream.App/Rendering/Wb/WbDrawDispatcher.cs`;
@ -153,7 +186,13 @@ listening; sparse-scene 239 FPS samples are not substituted for that gate.
`src/AcDream.Content/BoundedDatObjectCache.cs`;
`src/AcDream.Content/DecodedTextureCache.cs`;
`src/AcDream.App/Rendering/FramePacingController.cs`;
`src/AcDream.App/Rendering/WindowsHighResolutionFramePacingWaiter.cs`.
`src/AcDream.App/Rendering/WindowsHighResolutionFramePacingWaiter.cs`;
`src/AcDream.App/Diagnostics/FrameProfiler.cs`;
`src/AcDream.App/Rendering/GameWindow.cs`;
`src/AcDream.App/Rendering/Wb/ObjectMeshManager.cs`;
`src/AcDream.App/Rendering/Wb/CachedBatch.cs`;
`src/AcDream.App/Rendering/Wb/EntityClassificationCache.cs`;
`src/AcDream.App/UI/Testing/RetailUiAutomationScriptRunner.cs`.
**Research:**
`docs/research/2026-07-18-retail-shared-alpha-list-pseudocode.md`;