Refactor editor windowing and update renderer regression

This commit is contained in:
2026-04-26 03:41:58 +08:00
parent 68993c46bb
commit 4fcaac81d6
39 changed files with 1181 additions and 872 deletions

View File

@@ -1,93 +0,0 @@
# Rendering SRP / URP Closeout Plan
更新日期: `2026-04-26`
状态: `Completed, Phase 1 closeout done`
## 1. 长期目标
目标不是继续堆更多 URP 外形,而是把默认渲染主线真正收口为:
`GraphicsSettings.renderPipelineAsset -> UniversalRenderPipelineAsset -> ScriptableRendererData -> UniversalRenderer -> ScriptableRendererFeature/Pass -> ScriptableRenderPipelineHost -> native backend contract -> RenderGraph / RHI`
收口后的职责边界:
- managed URP 负责 camera policy、renderer 选择、stage planning、feature/pass 编排、final color 策略
- native Rendering 负责 scene extraction、scene draw、fullscreen graph execution、RenderGraph/RHI
- `BuiltinForwardPipeline` 或其后继只保留 backend 语义,不继续承载产品层策略
## 2. 阶段路线
### Phase 1: Renderer-backed URP v1 收口
- 让默认 `UniversalRenderPipelineAsset -> UniversalRenderer` 成为唯一上层主线
- 先收口 ownership 和 contract不在本阶段做 backend 大拆分
### Phase 2: Native backend contract 抽取
- 把默认 native backend 从产品层语义里剥离出来
- 让 host/bridge 面向稳定 backend contract而不是面向 builtin forward 产品实现
### Phase 3: Feature ownership 迁移
- 把 feature 的启用、排序、插入点统一回收到 managed `ScriptableRendererFeature`
### Phase 4: Asset / Editor / Runtime 产品化
- 稳定 renderer data、camera override、runtime invalidation、editor 消费路径
### Phase 5: 收尾与清理
- 删除临时兼容层,统一命名和文档
## 3. Phase 1 已完成进展
- 已补齐长期目标文档和 Rendering 模块目标描述
- 已把 managed backend 解析从“隐式默认 fallback”改成“显式策略”
- 已新增 `ManagedPipelineRendererAssetPolicy`
- 已让 `ManagedScriptableRenderPipelineAsset` 先读显式 renderer asset再按 policy 解析 default native backend
- 已让 `MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset()` 不再直接偷偷创建默认 native backend asset
- 已让 Mono runtime 显式返回 `DefaultNativeBackend` policy
- 已把 `UniversalRenderer``PostProcess` 变成显式 stage 分支
- 已补 `UniversalPostProcessBlock.EnqueueRenderPasses()` 作为显式入口
- 已把 `RuntimeStateHashUtility` 调整为跨程序集可见
- 已把 `ScriptableRendererFeature.CreateInstance()` 调整为可供外部受控复用
- 已更新一批 scripting 侧测试预期,使默认 URP/managed pipeline case 面向“显式 default backend policy”
- 已完成 editor 编译与 12 秒启动冒烟
- `XCUIEditorApp` 编译通过
- `build/editor/Debug/XCEngine.exe` 12 秒启动烟测通过
## 4. Phase 1 验收结果
- 已修掉 `managed/GameScripts/RenderPipelineApiProbe.cs` 中挡住本阶段验证的 managed API 问题
- `scripting_tests` 已恢复为可用基线,并通过 9 条聚焦的 SRP/URP 回归用例
- 默认 backend 来源、default renderer fallback、feature 注入、renderer invalidation 等关键主路径已被 focused regression tests 覆盖
- editor 侧验证已补齐,`XCUIEditorApp` 编译与 `build/editor/Debug/XCEngine.exe` 12 秒启动烟测均通过
- `rendering_unit_tests` 仍存在与本次收口无关的既有编译断点,但不再阻塞 Phase 1 收口验收
## 5. 当前 subplan
本轮 subplan 已完成,已从执行列表清空。
### 5.1 已完成验收项
- 默认 backend 来源已变成显式可追踪的 policy
- `PostProcess` ownership 已稳定挂到 `UniversalRenderer`
- `scripting_tests` 已能稳定覆盖本阶段相关用例
- 默认 URP 主路径已具备 focused regression tests
- Phase 1 未再引入新的隐式 fallback 语义
## 6. 下一阶段建议
下一阶段可以进入 Phase 2但不要重新把产品层策略带回 native:
1. 抽取更稳定的 native backend contract继续收窄 host/bridge 对具体 builtin forward 实现的依赖
2. 继续把 feature 的启用、排序、插入点留在 managed `ScriptableRendererFeature / UniversalRenderer` 主线
3. 在当前 focused regression baseline 之上继续稳住 renderer invalidation、asset authoring 和 editor/runtime 消费路径
## 7. 非目标
- 本阶段不直接重命名 `BuiltinForwardPipeline`
- 不在本阶段完成 backend-only 最终类层次
- 不引入 deferred、clustered lighting、完整 volume framework 等新能力
- 不把 editor tooling 路径强行并进默认 URP 产品主线

View File

@@ -1,141 +1 @@
# 渲染模块长期目标与下一阶段执行计划
更新时间: `2026-04-26`
状态: `Active`
执行闸门:
- 每完成一个阶段,先编译并启动 `editor`
-`editor` 执行不少于 `12s` 的冒烟测试,确认进程可启动、主循环可持续运行且无立即崩溃。
- 只有在该阶段编译和 `12s` 冒烟测试都通过后,才允许执行该阶段的 `commit``push`
说明: 本文基于当前仓库中的实际代码重新审核后编写,用于替代已经失效的 `rendering_srp_urp_closeout_plan.md`。本计划只按现有实现说话,不沿用旧文档中的“已收口完成”结论。
## 1. 基于代码的审核结论
- 当前默认渲染主线是
`SceneRenderer -> SceneRenderRequestPlanner -> RenderPipelineHost -> CameraFramePlanBuilder -> CameraRenderer -> ExecuteCameraFrameRenderGraphPlan`不是“managed URP 直接驱动 native backend”的单线结构。
- 当前默认顶层 pipeline 已经是 `ScriptableRenderPipelineHost`。在没有显式 preferred asset 时,`RenderPipelineFactory` 会优先尝试 configured managed pipeline asset失败后回落到 host assethost 的默认 backend 是 `BuiltinForwardPipelineAsset`
- managed SRP 不是空壳。当前已经具备 `ScriptableRenderPipelinePlanningContext``RenderSceneSetupContext``DirectionalShadowExecutionContext``ScriptableRenderContext`,能够参与 request/frame plan、scene setup、shadow policy、scene draw 和 fullscreen stage 录制。
- 但 managed/backend contract 还没有真正完成。`MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset()` 当前不会返回 shared backend asset`GetPipelineRendererAssetPolicy()` 在 managed asset 可用时固定返回 `DefaultNativeBackend`。也就是说,现阶段 managed renderer 仍统一依赖默认 native scene backend。
- `RenderGraph` 的 managed 接口目前是 v1。它能创建 transient texture、记录 scene phase / injection point / native feature pass、按 desc 调 `DrawRenderers`,也能提交 raster pass但 raster pass execution 仍只覆盖 `ColorScale` / `ShaderVector` / `FinalColor` 三类 fullscreen execution且 flush 逻辑只对 fullscreen sequence stage 生效。
- `UniversalRenderPipelineAsset` / `RendererBackedRenderPipelineAsset` 已支持 `rendererDataList``defaultRendererIndex``UniversalAdditionalCameraData.rendererIndex`,但 `UniversalPostProcessBlock` 仍为空实现,默认后处理主要依赖 feature 注入和 `FinalOutput` 内置 pass。
- `BuiltinForwardPipeline` 仍同时承担 fallback pipeline、默认 `SceneDrawBackend`、默认 native feature host 三个角色,是当前渲染模块最大的耦合点。
- editor tooling 仍是独立层。`CameraRenderer` 顶层安装 `BuiltinObjectIdPass`,而 scene viewport 的 grid / selection / helper pass 仍在 editor 专用路径,不应并入本阶段 SRP / URP 主线计划。
## 2. 长期目标
- 稳定总主线:
`SceneRenderer -> SceneRenderRequestPlanner -> CameraFramePlanBuilder -> CameraRenderer -> ScriptableRenderPipelineHost -> managed stage recorder / native scene draw backend -> RenderGraph / RHI`
- 稳定职责边界:
managed 负责 camera / request / frame plan、renderer 选择、feature / pass 排序、fullscreen stage 组合、scene setup、shadow policynative 负责 scene extraction、culling、scene draw backend、资源生命周期、RenderGraph 编译执行、RHI。
-`ScriptableRenderPipelineHost` 成为唯一可信的 SRP 边界,而不是继续把产品层策略散落在 `BuiltinForwardPipeline` 和 editor / runtime 兼容层里。
-`BuiltinForwardPipeline` 收敛为清晰的 fallback / backend 角色,避免它继续同时承担“默认产品主线”和“可复用 native backend”两套语义。
-`rendererDataList``rendererIndex`、feature invalidation、bridge generation refresh、asset runtime versioning 变成稳定 contract而不是靠隐式 fallback 维持行为。
- 如果未来真的需要多个 native backend asset必须通过明确定义的 backend asset contract 接入,而不是继续复用当前未完成的 placeholder API。
- 明确 runtime 主渲染与 editor viewport / tooling 的共用层和专用层,避免后续计划再次混写。
## 3. 当前约束
- 下一阶段不做纯 managed scene draw backend不承诺把 Gaussian Splat / Volumetric 改写为纯 C# feature。
- 下一阶段不新增 deferred、clustered lighting、完整 volume framework 等新能力。
- 下一阶段不改 editor viewport render loop也不把 grid / selection / helper pass 并入 runtime 主线。
- 下一阶段不把 managed `RenderGraph` 包装误写成“通用图形 / 计算图 API”当前它只是 SRP v1 录制接口。
## 4. 下一阶段执行计划
### 4.1 先把 backend contract 讲真
状态: `Completed` (`2026-04-26`)
目标: 把“当前唯一真实可用的是 `DefaultNativeBackend`”写进代码和测试,不再保留会误导人的伪完成语义。
执行:
- 重新审核 `ManagedRenderPipelineAssetRuntime``MonoManagedRenderPipelineAssetRuntime``RenderPipelineFactory``ScriptableRenderPipelineHost` 的 backend 选择路径。
- 对未实现的 explicit backend asset 分支做二选一收口:要么真正实现 shared backend asset 解析,要么明确删除 / 禁用该分支并补充注释与测试。
-`DefaultNativeBackend` 作为当前正式 contract 固化下来,避免再出现“文档已完成、代码仍默认回落”的错位。
完成标志:
- 代码、测试、文档对 backend 选择语义一致。
- 不再有“managed renderer 已支持 explicit backend asset”这一错误暗示。
### 4.2 从 `BuiltinForwardPipeline` 中抽出可复用的 native scene backend
状态: `Completed` (`2026-04-26`)
目标: 减轻 `BuiltinForwardPipeline` 的三重职责,让 host fallback 和 scene draw backend 可以独立演进。
执行:
-`BuiltinForwardSceneSetup``BuiltinForwardPipeline``NativeSceneRecorder` 梳理出稳定的 `SceneDrawBackend` 组装层。
-`ShadowCaster``DepthOnly`、main scene feature host 的 ownership 拆清楚,避免 host / backend / fallback wrapper 重复配置。
- 统一 fallback path 和 managed recorder path 对默认 native feature 的消费方式,减少双份默认注册逻辑的漂移风险。
完成标志:
- fallback pipeline 仍可独立工作。
- managed stage recorder 与 fallback path 共用同一套默认 native backend 组装逻辑。
### 4.3 固化 managed SRP v1 能力边界
状态: `Completed` (`2026-04-26`)
目标: 把现有 managed API 从“隐式能力集合”收敛成明确的 v1 contract便于后续扩展而不是继续误判能力上限。
执行:
- 整理 `ScriptableRenderContext``ScriptableRenderPipelinePlanningContext``RenderSceneSetupContext``DirectionalShadowExecutionContext` 的能力矩阵。
- 对“fullscreen raster-only”“仅 fullscreen sequence stage flush managed raster pass”“scene draw 仍依赖 native backend”等限制补齐断言、测试和文档。
- 补齐 `UniversalPostProcessBlock` 当前的真实语义说明:默认后处理并未在 block 内完成,仍主要依赖 feature / pass 注入与 `FinalOutput` 内置 pass。
完成标志:
- managed 侧能做什么、不能做什么有明确边界。
- 后续计划不再把现有 API 误写成完整 URP runtime 或通用 RenderGraph API。
### 4.4 稳住 renderer authoring / invalidation / bridge refresh
状态: `Completed` (`2026-04-26`)
目标: 把当前已经存在但还容易漂移的 authoring 路径变成可回归验证的稳定面。
执行:
- 围绕 `rendererDataList``defaultRendererIndex``UniversalAdditionalCameraData.rendererIndex`、feature `SetDirty` / invalidation、bridge generation refresh 增加 focused tests。
- 验证 default asset selection、explicit managed asset selection、bridge rebinding 这三条路径在 frame plan 和实际渲染行为上保持一致。
- 明确 renderer 选择、feature 变更和 runtime resource version 之间的刷新链路,避免再次回退到隐式缓存。
完成标志:
- renderer 切换、feature 改动、bridge 切换都有回归保护。
- `CameraFramePlanBuilder``CameraRenderer` 对 managed path 的依赖关系稳定可追踪。
## 5. 下一阶段完成后的验收口径
- `ScriptableRenderPipelineHost` 的角色描述不再含混。
- `DefaultNativeBackend` 与 explicit backend asset 的语义只保留一种真实状态。
- `BuiltinForwardPipeline` 不再是继续扩张的“总包类”。
- managed SRP v1 的能力边界和限制有文档、有测试、有 fail-fast。
- renderer authoring / invalidation / bridge refresh 不再依赖人工记忆。
## 6. 审核依据
- `engine/src/Rendering/Execution/SceneRenderer.cpp`
- `engine/src/Rendering/Planning/SceneRenderRequestPlanner.cpp`
- `engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp`
- `engine/src/Rendering/Execution/CameraRenderer.cpp`
- `engine/src/Rendering/Internal/RenderPipelineFactory.cpp`
- `engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp`
- `engine/src/Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.cpp`
- `engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp`
- `engine/src/Scripting/Mono/MonoScriptRuntime.cpp`
- `managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs`
- `managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelinePlanningContext.cs`
- `managed/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs`
- `managed/XCEngine.ScriptCore/Rendering/Graph/RenderGraphRasterPassBuilder.cs`
- `managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs`
- `managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs`
- `managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalPostProcessBlock.cs`