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:
parent
3718e341be
commit
b95bb3e21c
4 changed files with 336 additions and 15 deletions
|
|
@ -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.3–6.2 ms CPU / 7.1–8.3 ms p95 and 3.2–3.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.3–6.2 ms CPU p50, 7.1–8.3 ms CPU p95, and 3.2–3.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.93–5.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.1–4.0 /
|
||||
1.6–5.1 ms and GPU p50/p95 from 0.7–2.8 / 1.0–3.4 ms. Across the turn
|
||||
windows, those ranges were 1.0–3.1 / 1.8–4.9 ms CPU and
|
||||
0.7–2.0 / 1.2–3.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`;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue