refactor(srp): formalize universal renderer selection and caching

This commit is contained in:
2026-04-20 00:16:32 +08:00
parent ad32d64269
commit cbc0ddbd42
6 changed files with 379 additions and 38 deletions

View File

@@ -7,6 +7,7 @@ namespace XCEngine.Rendering.Universal
public abstract class ScriptableRendererData : Object
{
private ScriptableRendererFeature[] m_rendererFeatures;
private ScriptableRenderer m_rendererInstance;
protected ScriptableRendererData()
{
@@ -14,7 +15,17 @@ namespace XCEngine.Rendering.Universal
internal ScriptableRenderer CreateRendererInstance()
{
return CreateRenderer();
return GetRendererInstance();
}
internal ScriptableRenderer GetRendererInstance()
{
if (m_rendererInstance == null)
{
m_rendererInstance = CreateRenderer();
}
return m_rendererInstance;
}
internal ScriptableRendererFeature[] CreateRendererFeaturesInstance()

View File

@@ -6,19 +6,18 @@ namespace XCEngine.Rendering.Universal
internal sealed class UniversalRenderPipeline
: ScriptableRenderPipeline
{
private readonly ScriptableRendererData m_rendererData;
private ScriptableRenderer m_renderer;
private readonly UniversalRenderPipelineAsset m_asset;
public UniversalRenderPipeline(
ScriptableRendererData rendererData)
UniversalRenderPipelineAsset asset)
{
m_rendererData = rendererData;
m_asset = asset;
}
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
ScriptableRenderer renderer = GetOrCreateRenderer();
ScriptableRenderer renderer = GetDefaultRenderer();
return renderer != null &&
renderer.SupportsStageRenderGraph(stage);
}
@@ -26,21 +25,16 @@ namespace XCEngine.Rendering.Universal
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
ScriptableRenderer renderer = GetOrCreateRenderer();
ScriptableRenderer renderer = GetDefaultRenderer();
return renderer != null &&
renderer.RecordStageRenderGraph(context);
}
private ScriptableRenderer GetOrCreateRenderer()
private ScriptableRenderer GetDefaultRenderer()
{
if (m_renderer == null &&
m_rendererData != null)
{
m_renderer =
m_rendererData.CreateRendererInstance();
}
return m_renderer;
return m_asset != null
? m_asset.GetDefaultRenderer()
: null;
}
}
}

View File

@@ -15,10 +15,8 @@ namespace XCEngine.Rendering.Universal
protected override ScriptableRenderPipeline CreatePipeline()
{
ScriptableRendererData resolvedRendererData =
ResolveDefaultRendererData();
return resolvedRendererData != null
? new UniversalRenderPipeline(resolvedRendererData)
return GetDefaultRendererData() != null
? new UniversalRenderPipeline(this)
: null;
}
@@ -26,7 +24,7 @@ namespace XCEngine.Rendering.Universal
CameraRenderRequestContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveDefaultRendererData();
GetDefaultRendererData();
if (resolvedRendererData != null)
{
resolvedRendererData.ConfigureCameraRenderRequestInstance(
@@ -37,38 +35,86 @@ namespace XCEngine.Rendering.Universal
protected override string GetPipelineRendererAssetKey()
{
ScriptableRendererData resolvedRendererData =
ResolveDefaultRendererData();
GetDefaultRendererData();
return resolvedRendererData != null
? resolvedRendererData.GetPipelineRendererAssetKeyInstance()
: string.Empty;
}
private ScriptableRendererData ResolveDefaultRendererData()
internal ScriptableRendererData GetDefaultRendererData()
{
if (rendererDataList == null ||
rendererDataList.Length == 0)
return GetRendererData(defaultRendererIndex);
}
internal ScriptableRenderer GetDefaultRenderer()
{
return GetRenderer(defaultRendererIndex);
}
internal ScriptableRendererData GetRendererData(
int rendererIndex)
{
EnsureRendererDataList();
int resolvedRendererIndex =
ResolveRendererIndex(rendererIndex);
if (rendererDataList[resolvedRendererIndex] == null)
{
rendererDataList =
new ScriptableRendererData[]
{
new UniversalRendererData()
};
defaultRendererIndex = 0;
rendererDataList[resolvedRendererIndex] =
new UniversalRendererData();
}
return rendererDataList[resolvedRendererIndex];
}
internal ScriptableRenderer GetRenderer(
int rendererIndex)
{
ScriptableRendererData rendererData =
GetRendererData(rendererIndex);
return rendererData != null
? rendererData.GetRendererInstance()
: null;
}
private void EnsureRendererDataList()
{
if (rendererDataList != null &&
rendererDataList.Length > 0)
{
return;
}
rendererDataList =
new ScriptableRendererData[]
{
new UniversalRendererData()
};
defaultRendererIndex = 0;
}
private int ResolveRendererIndex(
int rendererIndex)
{
EnsureRendererDataList();
if (rendererIndex < 0 ||
rendererIndex >= rendererDataList.Length)
{
return ResolveDefaultRendererIndex();
}
return rendererIndex;
}
private int ResolveDefaultRendererIndex()
{
EnsureRendererDataList();
if (defaultRendererIndex < 0 ||
defaultRendererIndex >= rendererDataList.Length)
{
defaultRendererIndex = 0;
}
if (rendererDataList[defaultRendererIndex] == null)
{
rendererDataList[defaultRendererIndex] =
new UniversalRendererData();
}
return rendererDataList[defaultRendererIndex];
return defaultRendererIndex;
}
}
}