refactor(srp): add managed lifecycle cleanup seams

Invoke managed pipeline disposal and asset runtime cleanup from the native bridge lifecycle. Add Universal renderer and feature cleanup hooks plus regression probes to verify runtime cache teardown semantics.
This commit is contained in:
2026-04-20 01:14:37 +08:00
parent beaf5809d5
commit 58dde75d3d
10 changed files with 900 additions and 0 deletions

View File

@@ -917,6 +917,126 @@ namespace Gameplay
}
}
internal static class ManagedLifecycleProbeState
{
public static int CreatePipelineCallCount;
public static int CreateRendererCallCount;
public static int CreateFeatureCallCount;
public static int ReleaseRendererDataRuntimeResourcesCallCount;
public static int DisposePipelineCallCount;
public static int ReleaseAssetRuntimeResourcesCallCount;
public static int DisposeRendererCallCount;
public static int DisposeFeatureCallCount;
public static void Reset()
{
CreatePipelineCallCount = 0;
CreateRendererCallCount = 0;
CreateFeatureCallCount = 0;
ReleaseRendererDataRuntimeResourcesCallCount = 0;
DisposePipelineCallCount = 0;
ReleaseAssetRuntimeResourcesCallCount = 0;
DisposeRendererCallCount = 0;
DisposeFeatureCallCount = 0;
}
}
internal sealed class ManagedLifecycleProbeRendererFeature
: ScriptableRendererFeature
{
protected override void ReleaseRuntimeResources()
{
ManagedLifecycleProbeState.DisposeFeatureCallCount++;
}
}
internal sealed class ManagedLifecycleProbeRenderer
: ScriptableRenderer
{
public ManagedLifecycleProbeRenderer(
ScriptableRendererFeature[] rendererFeatures)
{
ScriptableRendererFeature[] resolvedRendererFeatures =
rendererFeatures ?? Array.Empty<ScriptableRendererFeature>();
for (int i = 0; i < resolvedRendererFeatures.Length; ++i)
{
AddFeature(resolvedRendererFeatures[i]);
}
}
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return stage == CameraFrameStage.MainScene;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return context != null;
}
protected override void ReleaseRuntimeResources()
{
ManagedLifecycleProbeState.DisposeRendererCallCount++;
}
}
internal sealed class ManagedLifecycleProbeRendererData
: ScriptableRendererData
{
protected override ScriptableRenderer CreateRenderer()
{
ManagedLifecycleProbeState.CreateRendererCallCount++;
return new ManagedLifecycleProbeRenderer(
CreateRendererFeatures());
}
protected override ScriptableRendererFeature[] CreateRendererFeatures()
{
ManagedLifecycleProbeState.CreateFeatureCallCount++;
return new ScriptableRendererFeature[]
{
new ManagedLifecycleProbeRendererFeature()
};
}
protected override string GetPipelineRendererAssetKey()
{
return "BuiltinForward";
}
protected override void ReleaseRuntimeResources()
{
ManagedLifecycleProbeState.ReleaseRendererDataRuntimeResourcesCallCount++;
}
}
internal sealed class ManagedPipelineDisposeProbe
: ScriptableRenderPipeline
{
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return stage == CameraFrameStage.MainScene;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return context != null;
}
protected override void Dispose(
bool disposing)
{
if (disposing)
{
ManagedLifecycleProbeState.DisposePipelineCallCount++;
}
}
}
public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset
{
}
@@ -925,6 +1045,40 @@ namespace Gameplay
{
}
public sealed class ManagedPipelineDisposeProbeAsset
: ScriptableRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
{
ManagedLifecycleProbeState.CreatePipelineCallCount++;
return new ManagedPipelineDisposeProbe();
}
}
public sealed class ManagedUniversalLifecycleProbeAsset
: UniversalRenderPipelineAsset
{
public ManagedUniversalLifecycleProbeAsset()
{
rendererDataList = new ScriptableRendererData[]
{
new ManagedLifecycleProbeRendererData()
};
}
protected override ScriptableRenderPipeline CreatePipeline()
{
ManagedLifecycleProbeState.CreatePipelineCallCount++;
return base.CreatePipeline();
}
protected override void ReleaseRuntimeResources()
{
ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount++;
ReleaseRendererDataRuntimeResources();
}
}
public sealed class ManagedRenderPipelineProbeAsset
: UniversalRenderPipelineAsset
{
@@ -1323,6 +1477,86 @@ namespace Gameplay
}
}
public sealed class ManagedLifecycleObservationProbe
: MonoBehaviour
{
public int ObservedCreatePipelineCallCount;
public int ObservedCreateRendererCallCount;
public int ObservedCreateFeatureCallCount;
public int ObservedReleaseRendererDataRuntimeResourcesCallCount;
public int ObservedDisposePipelineCallCount;
public int ObservedReleaseAssetRuntimeResourcesCallCount;
public int ObservedDisposeRendererCallCount;
public int ObservedDisposeFeatureCallCount;
public void Start()
{
ManagedLifecycleProbeState.Reset();
}
public void Update()
{
ObservedCreatePipelineCallCount =
ManagedLifecycleProbeState.CreatePipelineCallCount;
ObservedCreateRendererCallCount =
ManagedLifecycleProbeState.CreateRendererCallCount;
ObservedCreateFeatureCallCount =
ManagedLifecycleProbeState.CreateFeatureCallCount;
ObservedReleaseRendererDataRuntimeResourcesCallCount =
ManagedLifecycleProbeState
.ReleaseRendererDataRuntimeResourcesCallCount;
ObservedDisposePipelineCallCount =
ManagedLifecycleProbeState.DisposePipelineCallCount;
ObservedReleaseAssetRuntimeResourcesCallCount =
ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount;
ObservedDisposeRendererCallCount =
ManagedLifecycleProbeState.DisposeRendererCallCount;
ObservedDisposeFeatureCallCount =
ManagedLifecycleProbeState.DisposeFeatureCallCount;
}
}
public sealed class ManagedUniversalLifecycleRuntimeSelectionProbe
: MonoBehaviour
{
public int ObservedCreatePipelineCallCount;
public int ObservedCreateRendererCallCount;
public int ObservedCreateFeatureCallCount;
public int ObservedReleaseRendererDataRuntimeResourcesCallCount;
public int ObservedDisposePipelineCallCount;
public int ObservedReleaseAssetRuntimeResourcesCallCount;
public int ObservedDisposeRendererCallCount;
public int ObservedDisposeFeatureCallCount;
public void Start()
{
ManagedLifecycleProbeState.Reset();
GraphicsSettings.renderPipelineAsset =
new ManagedUniversalLifecycleProbeAsset();
}
public void Update()
{
ObservedCreatePipelineCallCount =
ManagedLifecycleProbeState.CreatePipelineCallCount;
ObservedCreateRendererCallCount =
ManagedLifecycleProbeState.CreateRendererCallCount;
ObservedCreateFeatureCallCount =
ManagedLifecycleProbeState.CreateFeatureCallCount;
ObservedReleaseRendererDataRuntimeResourcesCallCount =
ManagedLifecycleProbeState
.ReleaseRendererDataRuntimeResourcesCallCount;
ObservedDisposePipelineCallCount =
ManagedLifecycleProbeState.DisposePipelineCallCount;
ObservedReleaseAssetRuntimeResourcesCallCount =
ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount;
ObservedDisposeRendererCallCount =
ManagedLifecycleProbeState.DisposeRendererCallCount;
ObservedDisposeFeatureCallCount =
ManagedLifecycleProbeState.DisposeFeatureCallCount;
}
}
public sealed class ScriptCoreUniversalRenderPipelineSelectionProbe
: MonoBehaviour
{