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:
@@ -4,10 +4,23 @@ namespace XCEngine.Rendering
|
||||
{
|
||||
public abstract class ScriptableRenderPipeline : Object
|
||||
{
|
||||
private bool m_disposed;
|
||||
|
||||
protected ScriptableRenderPipeline()
|
||||
{
|
||||
}
|
||||
|
||||
internal void DisposeInstance()
|
||||
{
|
||||
if (m_disposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Dispose(true);
|
||||
m_disposed = true;
|
||||
}
|
||||
|
||||
protected virtual bool SupportsStageRenderGraph(
|
||||
CameraFrameStage stage)
|
||||
{
|
||||
@@ -19,6 +32,11 @@ namespace XCEngine.Rendering
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
protected virtual void Dispose(
|
||||
bool disposing)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,11 @@ namespace XCEngine.Rendering
|
||||
{
|
||||
}
|
||||
|
||||
internal void ReleaseRuntimeResourcesInstance()
|
||||
{
|
||||
ReleaseRuntimeResources();
|
||||
}
|
||||
|
||||
protected virtual ScriptableRenderPipeline CreatePipeline()
|
||||
{
|
||||
return null;
|
||||
@@ -27,6 +32,10 @@ namespace XCEngine.Rendering
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
protected virtual void ReleaseRuntimeResources()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,11 +10,35 @@ namespace XCEngine.Rendering.Universal
|
||||
new List<ScriptableRendererFeature>();
|
||||
private readonly List<ScriptableRenderPass> m_activePassQueue =
|
||||
new List<ScriptableRenderPass>();
|
||||
private bool m_disposed;
|
||||
|
||||
protected ScriptableRenderer()
|
||||
{
|
||||
}
|
||||
|
||||
internal void ReleaseRuntimeResourcesInstance()
|
||||
{
|
||||
if (m_disposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseRuntimeResources();
|
||||
|
||||
for (int i = 0; i < m_features.Count; ++i)
|
||||
{
|
||||
ScriptableRendererFeature feature = m_features[i];
|
||||
if (feature != null)
|
||||
{
|
||||
feature.ReleaseRuntimeResourcesInstance();
|
||||
}
|
||||
}
|
||||
|
||||
m_features.Clear();
|
||||
m_activePassQueue.Clear();
|
||||
m_disposed = true;
|
||||
}
|
||||
|
||||
public void EnqueuePass(
|
||||
ScriptableRenderPass renderPass)
|
||||
{
|
||||
@@ -126,6 +150,10 @@ namespace XCEngine.Rendering.Universal
|
||||
|
||||
AddRenderPasses(renderingData);
|
||||
}
|
||||
|
||||
protected virtual void ReleaseRuntimeResources()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,35 @@ namespace XCEngine.Rendering.Universal
|
||||
return GetPipelineRendererAssetKey();
|
||||
}
|
||||
|
||||
internal void ReleaseRuntimeResourcesInstance()
|
||||
{
|
||||
if (m_rendererInstance != null)
|
||||
{
|
||||
m_rendererInstance.ReleaseRuntimeResourcesInstance();
|
||||
m_rendererInstance = null;
|
||||
m_rendererFeatures = null;
|
||||
ReleaseRuntimeResources();
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_rendererFeatures != null)
|
||||
{
|
||||
for (int i = 0; i < m_rendererFeatures.Length; ++i)
|
||||
{
|
||||
ScriptableRendererFeature rendererFeature =
|
||||
m_rendererFeatures[i];
|
||||
if (rendererFeature != null)
|
||||
{
|
||||
rendererFeature.ReleaseRuntimeResourcesInstance();
|
||||
}
|
||||
}
|
||||
|
||||
m_rendererFeatures = null;
|
||||
}
|
||||
|
||||
ReleaseRuntimeResources();
|
||||
}
|
||||
|
||||
internal void ConfigureCameraRenderRequestInstance(
|
||||
CameraRenderRequestContext context)
|
||||
{
|
||||
@@ -80,6 +109,10 @@ namespace XCEngine.Rendering.Universal
|
||||
return Array.Empty<ScriptableRendererFeature>();
|
||||
}
|
||||
|
||||
protected virtual void ReleaseRuntimeResources()
|
||||
{
|
||||
}
|
||||
|
||||
protected bool HasDirectionalShadow(
|
||||
CameraRenderRequestContext context)
|
||||
{
|
||||
|
||||
@@ -5,12 +5,25 @@ namespace XCEngine.Rendering.Universal
|
||||
{
|
||||
public abstract class ScriptableRendererFeature
|
||||
{
|
||||
private bool m_disposed;
|
||||
|
||||
protected ScriptableRendererFeature()
|
||||
{
|
||||
}
|
||||
|
||||
public bool isActive { get; set; } = true;
|
||||
|
||||
internal void ReleaseRuntimeResourcesInstance()
|
||||
{
|
||||
if (m_disposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseRuntimeResources();
|
||||
m_disposed = true;
|
||||
}
|
||||
|
||||
public virtual void Create()
|
||||
{
|
||||
}
|
||||
@@ -47,6 +60,10 @@ namespace XCEngine.Rendering.Universal
|
||||
.Rendering_CameraRenderRequestContext_ClearDirectionalShadow(
|
||||
context.nativeHandle);
|
||||
}
|
||||
|
||||
protected virtual void ReleaseRuntimeResources()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,11 @@ namespace XCEngine.Rendering.Universal
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
protected override void ReleaseRuntimeResources()
|
||||
{
|
||||
ReleaseRendererDataRuntimeResources();
|
||||
}
|
||||
|
||||
internal ScriptableRendererData GetDefaultRendererData()
|
||||
{
|
||||
return GetRendererData(defaultRendererIndex);
|
||||
@@ -92,6 +97,42 @@ namespace XCEngine.Rendering.Universal
|
||||
defaultRendererIndex = 0;
|
||||
}
|
||||
|
||||
protected void ReleaseRendererDataRuntimeResources()
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
|
||||
for (int i = 0; i < rendererDataList.Length; ++i)
|
||||
{
|
||||
ScriptableRendererData rendererData =
|
||||
rendererDataList[i];
|
||||
if (rendererData == null ||
|
||||
WasRendererDataReleasedEarlier(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
rendererData.ReleaseRuntimeResourcesInstance();
|
||||
}
|
||||
}
|
||||
|
||||
private bool WasRendererDataReleasedEarlier(
|
||||
int rendererDataIndex)
|
||||
{
|
||||
ScriptableRendererData rendererData =
|
||||
rendererDataList[rendererDataIndex];
|
||||
for (int i = 0; i < rendererDataIndex; ++i)
|
||||
{
|
||||
if (object.ReferenceEquals(
|
||||
rendererDataList[i],
|
||||
rendererData))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private int ResolveRendererIndex(
|
||||
int rendererIndex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user