From 6a538d0d2eb25487f0508dbeda0e64948d9a12b8 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 21 Apr 2026 14:52:04 +0800 Subject: [PATCH] refactor(srp): close renderer-backed backend seam --- ...kendSeamClosurePlan_完成归档_2026-04-21.md | 46 ++++ managed/GameScripts/RenderPipelineApiProbe.cs | 244 +----------------- .../RendererBackedRenderPipelineAsset.cs | 4 +- .../Scripts/ProjectRenderPipelineProbe.cs | 23 +- 4 files changed, 60 insertions(+), 257 deletions(-) create mode 100644 docs/used/SRP_RendererBackedBackendSeamClosurePlan_完成归档_2026-04-21.md diff --git a/docs/used/SRP_RendererBackedBackendSeamClosurePlan_完成归档_2026-04-21.md b/docs/used/SRP_RendererBackedBackendSeamClosurePlan_完成归档_2026-04-21.md new file mode 100644 index 00000000..89767868 --- /dev/null +++ b/docs/used/SRP_RendererBackedBackendSeamClosurePlan_完成归档_2026-04-21.md @@ -0,0 +1,46 @@ +# SRP RendererBacked Backend Seam Closure Plan + +日期:2026-04-21 + +## 背景 + +当前 SRP 主线已经把大部分 native backend 选择接缝从 generic `ScriptableRenderPipelineAsset` 和公共 SRP API 中移走,剩余最后一个公开口子仍然存在于 `RendererBackedRenderPipelineAsset`: + +- `GetPipelineRendererAssetKeyContextual(int rendererIndex)` + +这个设计的问题很明确: + +1. 它暗示项目侧或 generic SRP 资产可以直接决定 native backend key。 +2. 这和 Unity 风格分层不一致。`SRP` 负责抽象与调度,首方管线包才负责首方实现细节。 +3. 当前生产 native registry 实际只注册了 `BuiltinForward`,项目/探针层继续暴露这个 override 只会制造错误扩展面。 + +## 本阶段目标 + +1. 关闭 `RendererBackedRenderPipelineAsset` 上最后一个公开 backend key customization seam。 +2. 让 renderer-backed backend key 回到资产内部固定解析,不再允许项目层 override。 +3. 把仍依赖这个 seam 的项目探针/脚本探针迁移到 `UniversalRenderPipelineAsset` / `UniversalRendererData` 归属下。 +4. 清掉不再符合主线方向的 probe-only backend override 代码。 + +## 具体执行 + +1. 修改 `RendererBackedRenderPipelineAsset` + - 将 backend key 解析实现收为资产内部固定逻辑。 + - 不再保留供外部资产 override 的公开/受保护接缝。 + +2. 调整探针与项目脚本 + - 让需要 builtin forward backend 的自定义 renderer data 归位到 `UniversalRendererData` 分支。 + - 让依赖 renderer-backed 但本质属于 URP 范式的 probe asset 继承 `UniversalRenderPipelineAsset`。 + - 删除仅用于模拟 asset-level backend key override 的旧 probe 代码。 + +3. 验证 + - `cmake --build . --config Debug --target XCEditor` + - 运行旧版 `editor/bin/Debug/XCEngine.exe` + - 冒烟至少 10 秒 + - 检查 `editor/bin/Debug/editor.log` 中新的 `SceneReady` + +## 完成标准 + +1. 项目层和 probe 层不再 override renderer-backed backend key。 +2. `RendererBackedRenderPipelineAsset` 不再暴露该扩展缝。 +3. 旧版 `XCEditor` Debug 编译通过。 +4. 冒烟日志出现新的 `SceneReady`。 diff --git a/managed/GameScripts/RenderPipelineApiProbe.cs b/managed/GameScripts/RenderPipelineApiProbe.cs index 795a4086..ad3f808f 100644 --- a/managed/GameScripts/RenderPipelineApiProbe.cs +++ b/managed/GameScripts/RenderPipelineApiProbe.cs @@ -1022,82 +1022,6 @@ namespace Gameplay } } - internal sealed class ManagedUnknownBackendProbeRendererData - : ProbeRendererData - { - protected override ScriptableRenderer CreateProbeRenderer() - { - return new ManagedRenderPipelineProbe(); - } - } - - internal sealed class ManagedBuiltinForwardAliasProbeRendererData - : ProbeRendererData - { - protected override ScriptableRenderer CreateProbeRenderer() - { - return new ManagedRenderPipelineProbe(); - } - } - - internal sealed class ManagedRendererSelectionInactiveRenderer - : ScriptableRenderer - { - protected override bool SupportsRendererRecording( - RendererRecordingContext context) - { - return false; - } - - protected override bool RecordRenderer( - RendererRecordingContext context) - { - return false; - } - } - - internal sealed class ManagedRendererSelectionActiveRendererData - : ProbeRendererData - { - protected override ScriptableRenderer CreateProbeRenderer() - { - return new ProbeSceneRenderer(); - } - - protected override void ConfigureCameraRenderRequest( - CameraRenderRequestContext context) - { - if (HasDirectionalShadow(context)) - { - ClearDirectionalShadow(context); - } - } - - protected override void ConfigureCameraFramePlan( - ScriptableRenderPipelinePlanningContext context) - { - if (context == null || - context.IsStageRequested( - CameraFrameStage.PostProcess)) - { - return; - } - - context.RequestFullscreenStage( - CameraFrameStage.PostProcess, - CameraFrameColorSource.MainSceneColor); - } - } - - internal sealed class ManagedRendererSelectionInactiveRendererData - : ScriptableRendererData - { - protected override ScriptableRenderer CreateRenderer() - { - return new ManagedRendererSelectionInactiveRenderer(); - } - } - internal sealed class ManagedRendererReuseProbeRendererData : ProbeRendererData { @@ -1482,60 +1406,6 @@ namespace Gameplay } } - internal abstract class ProbePipelineRendererKeyAsset - : RendererBackedRenderPipelineAsset - { - protected sealed override string - GetPipelineRendererAssetKeyContextual( - int rendererIndex) - { - int resolvedRendererIndex = - ResolvePipelineRendererProbeIndex( - rendererIndex); - string overrideAssetKey = - ResolveProbePipelineRendererAssetKey( - resolvedRendererIndex); - return !string.IsNullOrEmpty(overrideAssetKey) - ? overrideAssetKey - : base.GetPipelineRendererAssetKeyContextual( - resolvedRendererIndex); - } - - protected virtual string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return string.Empty; - } - - private int ResolvePipelineRendererProbeIndex( - int rendererIndex) - { - if (rendererDataList != null && - rendererIndex >= 0 && - rendererIndex < rendererDataList.Length) - { - return rendererIndex; - } - - if (rendererDataList == null || - rendererDataList.Length == 0) - { - return -1; - } - - int resolvedDefaultRendererIndex = - defaultRendererIndex; - if (resolvedDefaultRendererIndex < 0 || - resolvedDefaultRendererIndex >= - rendererDataList.Length) - { - resolvedDefaultRendererIndex = 0; - } - - return resolvedDefaultRendererIndex; - } - } - public sealed class ManagedUniversalLifecycleProbeAsset : UniversalRenderPipelineAsset { @@ -1561,7 +1431,7 @@ namespace Gameplay } public sealed class ManagedRenderPipelineProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { public static int CreatePipelineCallCount; @@ -1581,7 +1451,7 @@ namespace Gameplay } public sealed class ManagedPostProcessRenderPipelineProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { public ManagedPostProcessRenderPipelineProbeAsset() { @@ -1593,42 +1463,6 @@ namespace Gameplay } } - public sealed class ManagedUnknownBackendRenderPipelineProbeAsset - : ProbePipelineRendererKeyAsset - { - public ManagedUnknownBackendRenderPipelineProbeAsset() - { - rendererDataList = new ScriptableRendererData[] - { - new ManagedUnknownBackendProbeRendererData() - }; - } - - protected override string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return "MissingBackend"; - } - } - - public sealed class ManagedBuiltinForwardAliasRenderPipelineProbeAsset - : ProbePipelineRendererKeyAsset - { - public ManagedBuiltinForwardAliasRenderPipelineProbeAsset() - { - rendererDataList = new ScriptableRendererData[] - { - new ManagedBuiltinForwardAliasProbeRendererData() - }; - } - - protected override string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return "BuiltinForwardAlias"; - } - } - public sealed class ManagedUniversalRenderPipelineProbeAsset : UniversalRenderPipelineAsset { @@ -1657,74 +1491,8 @@ namespace Gameplay } } - public sealed class ManagedDefaultRendererSelectionProbeAsset - : ProbePipelineRendererKeyAsset - { - public ManagedDefaultRendererSelectionProbeAsset() - { - rendererDataList = new ScriptableRendererData[] - { - new ManagedUnknownBackendProbeRendererData(), - new ManagedRenderPipelineProbeRendererData() - }; - defaultRendererIndex = 1; - } - - protected override string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return resolvedRendererIndex == 0 - ? "MissingBackend" - : string.Empty; - } - } - - public sealed class ManagedInvalidDefaultRendererSelectionProbeAsset - : ProbePipelineRendererKeyAsset - { - public ManagedInvalidDefaultRendererSelectionProbeAsset() - { - rendererDataList = new ScriptableRendererData[] - { - new ManagedRenderPipelineProbeRendererData(), - new ManagedUnknownBackendProbeRendererData() - }; - defaultRendererIndex = 5; - } - - protected override string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return resolvedRendererIndex == 1 - ? "MissingBackend" - : string.Empty; - } - } - - public sealed class ManagedFallbackRendererSelectionConsistencyProbeAsset - : ProbePipelineRendererKeyAsset - { - public ManagedFallbackRendererSelectionConsistencyProbeAsset() - { - rendererDataList = new ScriptableRendererData[] - { - new ManagedRendererSelectionActiveRendererData(), - new ManagedRendererSelectionInactiveRendererData() - }; - defaultRendererIndex = 7; - } - - protected override string ResolveProbePipelineRendererAssetKey( - int resolvedRendererIndex) - { - return resolvedRendererIndex == 1 - ? "MissingBackend" - : string.Empty; - } - } - public sealed class ManagedRendererReuseProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { public ManagedRendererReuseProbeAsset() { @@ -1738,7 +1506,7 @@ namespace Gameplay } public sealed class ManagedRendererInvalidationProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { private readonly ManagedRendererInvalidationProbeRendererData m_rendererData; @@ -1772,7 +1540,7 @@ namespace Gameplay } public sealed class ManagedPersistentFeatureProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { private readonly ManagedPersistentFeatureProbeRendererData m_rendererData; @@ -1800,7 +1568,7 @@ namespace Gameplay } public sealed class ManagedFeaturePassOrderProbeAsset - : RendererBackedRenderPipelineAsset + : UniversalRenderPipelineAsset { public ManagedFeaturePassOrderProbeAsset() { diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs index 1f9740bf..9d4f9ba3 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs @@ -71,13 +71,13 @@ namespace XCEngine.Rendering.Universal } } - protected string GetPipelineRendererAssetKey() + private protected string GetPipelineRendererAssetKey() { return GetPipelineRendererAssetKeyContextual( -1); } - protected virtual string GetPipelineRendererAssetKeyContextual( + private protected string GetPipelineRendererAssetKeyContextual( int rendererIndex) { ScriptableRendererData resolvedRendererData = diff --git a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs index 0bcfc589..5411d4cf 100644 --- a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs +++ b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs @@ -198,7 +198,7 @@ namespace ProjectScripts } public sealed class ProjectCustomRendererData - : ScriptableRendererData + : UniversalRendererData { protected override ScriptableRenderer CreateRenderer() { @@ -206,19 +206,8 @@ namespace ProjectScripts } } - public abstract class ProjectBuiltinForwardRendererBackedAsset - : RendererBackedRenderPipelineAsset - { - protected sealed override string - GetPipelineRendererAssetKeyContextual( - int rendererIndex) - { - return "BuiltinForward"; - } - } - public sealed class ProjectCustomRendererPipelineAsset - : ProjectBuiltinForwardRendererBackedAsset + : UniversalRenderPipelineAsset { public ProjectCustomRendererPipelineAsset() { @@ -311,7 +300,7 @@ namespace ProjectScripts } public sealed class ProjectRendererInvalidationProbeRendererData - : ScriptableRendererData + : UniversalRendererData { protected override ScriptableRenderer CreateRenderer() { @@ -348,7 +337,7 @@ namespace ProjectScripts } public sealed class ProjectRendererInvalidationProbeAsset - : ProjectBuiltinForwardRendererBackedAsset + : UniversalRenderPipelineAsset { private readonly ProjectRendererInvalidationProbeRendererData m_rendererData; @@ -440,7 +429,7 @@ namespace ProjectScripts } public sealed class ProjectPersistentFeatureProbeRendererData - : ScriptableRendererData + : UniversalRendererData { private readonly ProjectPersistentFeatureProbeRendererFeature m_feature = @@ -471,7 +460,7 @@ namespace ProjectScripts } public sealed class ProjectPersistentFeatureProbeAsset - : ProjectBuiltinForwardRendererBackedAsset + : UniversalRenderPipelineAsset { private readonly ProjectPersistentFeatureProbeRendererData m_rendererData;