test(app): add canonical connected soak snapshots
Make scripted lifecycle checkpoints acknowledged post-diagnostics render barriers, capture the exact frame outcome beside canonical resource ownership, and harden the nine-stop route with ordered same-location cache and lifetime gates without weakening process residency thresholds. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
2862622ba2
commit
bca4148739
17 changed files with 995 additions and 52 deletions
|
|
@ -103,7 +103,6 @@ public sealed class GameWindow :
|
|||
private LivePresentationRuntimeBindings? _livePresentationBindings;
|
||||
private SessionPlayerRuntimeBindings? _sessionPlayerBindings;
|
||||
private AcDream.App.Diagnostics.FrameScreenshotController? _frameScreenshots;
|
||||
private AcDream.App.Diagnostics.WorldLifecycleAutomationController? _worldLifecycleAutomation;
|
||||
private FrameRootRuntimeBindings? _frameRootBindings;
|
||||
private IDisposable? _frameGraphPublication;
|
||||
private AcDream.App.Rendering.GpuFrameFlightController? _gpuFrameFlights;
|
||||
|
|
@ -1048,15 +1047,13 @@ public sealed class GameWindow :
|
|||
FrameRootResult result)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(result);
|
||||
if (_worldLifecycleAutomation is not null
|
||||
|| _frameRootBindings is not null
|
||||
if (_frameRootBindings is not null
|
||||
|| _frameGraphPublication is not null)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"The GameWindow composition shell already owns frame roots.");
|
||||
}
|
||||
|
||||
_worldLifecycleAutomation = result.LifecycleAutomation;
|
||||
_frameRootBindings = result.RuntimeBindings;
|
||||
_frameGraphPublication = result.FrameGraphPublication;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,25 @@ internal interface IRenderFrameDiagnosticsPhase
|
|||
void Publish(RenderFrameInput input, RenderFrameOutcome outcome);
|
||||
}
|
||||
|
||||
internal interface IRenderFramePostDiagnosticsPhase
|
||||
{
|
||||
void Process(RenderFrameInput input, RenderFrameOutcome outcome);
|
||||
}
|
||||
|
||||
internal sealed class NullRenderFramePostDiagnosticsPhase :
|
||||
IRenderFramePostDiagnosticsPhase
|
||||
{
|
||||
public static NullRenderFramePostDiagnosticsPhase Instance { get; } = new();
|
||||
|
||||
private NullRenderFramePostDiagnosticsPhase()
|
||||
{
|
||||
}
|
||||
|
||||
public void Process(RenderFrameInput input, RenderFrameOutcome outcome)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes presentation transactions which may have opened before a later
|
||||
/// render phase failed. Recovery is idempotent so failures before the
|
||||
|
|
@ -102,6 +121,7 @@ internal sealed class RenderFrameOrchestrator : IGameRenderFrameRoot
|
|||
private readonly IWorldSceneFramePhase _world;
|
||||
private readonly IPrivatePresentationFramePhase _presentation;
|
||||
private readonly IRenderFrameDiagnosticsPhase _diagnostics;
|
||||
private readonly IRenderFramePostDiagnosticsPhase _postDiagnostics;
|
||||
private readonly IRenderFrameFailureRecovery _recovery;
|
||||
|
||||
public RenderFrameOrchestrator(
|
||||
|
|
@ -110,6 +130,7 @@ internal sealed class RenderFrameOrchestrator : IGameRenderFrameRoot
|
|||
IWorldSceneFramePhase world,
|
||||
IPrivatePresentationFramePhase presentation,
|
||||
IRenderFrameDiagnosticsPhase diagnostics,
|
||||
IRenderFramePostDiagnosticsPhase postDiagnostics,
|
||||
IRenderFrameFailureRecovery recovery)
|
||||
{
|
||||
_lifetime = lifetime ?? throw new ArgumentNullException(nameof(lifetime));
|
||||
|
|
@ -117,6 +138,8 @@ internal sealed class RenderFrameOrchestrator : IGameRenderFrameRoot
|
|||
_world = world ?? throw new ArgumentNullException(nameof(world));
|
||||
_presentation = presentation ?? throw new ArgumentNullException(nameof(presentation));
|
||||
_diagnostics = diagnostics ?? throw new ArgumentNullException(nameof(diagnostics));
|
||||
_postDiagnostics = postDiagnostics
|
||||
?? throw new ArgumentNullException(nameof(postDiagnostics));
|
||||
_recovery = recovery ?? throw new ArgumentNullException(nameof(recovery));
|
||||
}
|
||||
|
||||
|
|
@ -132,6 +155,7 @@ internal sealed class RenderFrameOrchestrator : IGameRenderFrameRoot
|
|||
_presentation.Render(input, world);
|
||||
var outcome = new RenderFrameOutcome(world, presentation);
|
||||
_diagnostics.Publish(input, outcome);
|
||||
_postDiagnostics.Process(input, outcome);
|
||||
return outcome;
|
||||
}
|
||||
catch (Exception error)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue