probe: ACDREAM_PROBE_REVEAL_TIMING — wall-clock attribution of the login/portal hold

[reveal-timing] lines from the reveal coordinator: per-dimension
first-ready edges (render neighborhood, composite textures, collision,
gate, materialization), 1 Hz progress with the resident-landblock count
(new GpuWorldState.LoadedLandblockCount), and one SUMMARY line at the
viewport reveal. Measurement-first groundwork for the login-load speedup:
the readiness barrier observes its dimensions serially, so the edges give
each dimension's observed tail while the progress lines expose the
pacing shape (a budget-paced linear drip reads directly off the counts).
Probe-gated in StreamingDiagnostics per Code Structure Rules §5; no
behavior change, one branch per Evaluate poll when unset.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-17 19:04:15 +02:00
parent 0bb47f2711
commit 695a27b48a
5 changed files with 190 additions and 2 deletions

View file

@ -68,6 +68,7 @@ internal sealed class WorldRevealCoordinator
private readonly IWorldRevealStreamingScheduler? _streaming;
private readonly IWorldRevealRenderResourceScheduler? _renderResources;
private readonly List<HostProjection> _hostProjections = [];
private readonly RevealTimingProbe? _timing;
private bool _hostRetryActive;
private bool _hostRetryRequested;
@ -83,7 +84,8 @@ internal sealed class WorldRevealCoordinator
Func<uint, bool> isSpawnClaimUnhydratable,
WorldGenerationQuiescence? quiescence = null,
IWorldRevealStreamingScheduler? streaming = null,
IWorldRevealRenderResourceScheduler? renderResources = null)
IWorldRevealRenderResourceScheduler? renderResources = null,
Func<int>? loadedLandblockCount = null)
{
_transit = transit ?? throw new ArgumentNullException(nameof(transit));
_readiness = new WorldRevealReadinessBarrier(
@ -98,6 +100,8 @@ internal sealed class WorldRevealCoordinator
_quiescence = quiescence;
_streaming = streaming;
_renderResources = renderResources;
if (StreamingDiagnostics.ProbeRevealTiming)
_timing = new RevealTimingProbe(loadedLandblockCount);
}
public RuntimePortalSnapshot Snapshot => _transit.Snapshot;
@ -117,6 +121,11 @@ internal sealed class WorldRevealCoordinator
_quiescence?.CaptureBegin() ?? default;
_readiness.Begin();
long generation = _transit.BeginLoginReveal(destinationCell);
_timing?.Begin(
"login",
generation,
destinationCell,
_readiness.RequiredWindow(destinationCell));
BeginHostLifetime(
generation,
destinationCell,
@ -151,6 +160,11 @@ internal sealed class WorldRevealCoordinator
}
_readiness.Begin();
_timing?.Begin(
"portal",
generation,
destinationCell,
_readiness.RequiredWindow(destinationCell));
BeginHostLifetime(
generation,
destinationCell,
@ -195,6 +209,7 @@ internal sealed class WorldRevealCoordinator
WorldRevealReadinessSnapshot snapshot = _readiness.Evaluate(destinationCell);
ReconcileDestinationReservationRadius(snapshot);
RuntimePortalSnapshot portal = _transit.Snapshot;
_timing?.Observe(snapshot, portal);
if (portal.Generation != 0)
{
_transit.AcknowledgeDestinationReadiness(