feat(srp): add renderer-driven pipeline backbone
Introduce renderer-driven and renderer-backed managed pipeline base types in the Universal package. Move shared renderer-data/default-renderer ownership out of UniversalRenderPipelineAsset, migrate probe assets onto the generic seam, and expose renderer recording/request context types for future SRP expansion. Update scripting API-surface expectations and validate with build, unit tests, scripting tests, and old editor smoke.
This commit is contained in:
161
docs/used/SRP_RendererDrivenPipeline执行接缝计划_2026-04-20.md
Normal file
161
docs/used/SRP_RendererDrivenPipeline执行接缝计划_2026-04-20.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# SRP Renderer-Driven Pipeline 执行接缝计划 2026-04-20
|
||||
|
||||
## 1. 阶段目标
|
||||
|
||||
上一阶段已经把 `CameraFramePlan` 的 managed 规划接缝接进来了:
|
||||
|
||||
1. `ScriptableRenderPipelineAsset -> ConfigureCameraFramePlan`
|
||||
2. `UniversalRenderPipelineAsset -> ScriptableRendererData -> ScriptableRendererFeature`
|
||||
|
||||
但执行层还有一个明显没收干净的问题:
|
||||
|
||||
1. `UniversalRenderPipelineAsset` 仍然自己持有一套 rendererData/defaultRenderer/runtime cleanup 逻辑
|
||||
2. `UniversalRenderPipeline` 仍然自己做一层很薄的 renderer forwarding
|
||||
3. managed renderer 虽然已经存在,但还没有被提炼成正式的 renderer-driven pipeline 骨架
|
||||
|
||||
这一阶段的目标就是把这层骨架正式抽出来:
|
||||
|
||||
1. 增加通用的 `RendererDrivenRenderPipeline`
|
||||
2. 增加通用的 `RendererBackedRenderPipelineAsset`
|
||||
3. 增加 `RendererBackedRenderPipeline`
|
||||
4. 给 Universal 正式迁移到这套骨架
|
||||
5. 补上 renderer execution 侧的上下文类型,给后续 SRP/URP 继续扩张留出稳定接口
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前问题
|
||||
|
||||
### 2.1 Universal 还在重复持有“通用 renderer 资产”逻辑
|
||||
|
||||
当前 `UniversalRenderPipelineAsset` 里同时承担了:
|
||||
|
||||
1. `rendererDataList/defaultRendererIndex`
|
||||
2. `GetRendererData/GetRenderer`
|
||||
3. `ConfigureCameraRenderRequest`
|
||||
4. `ConfigureCameraFramePlan`
|
||||
5. `GetPipelineRendererAssetKey`
|
||||
6. `ReleaseRendererDataRuntimeResources`
|
||||
|
||||
这些其实已经不是 `Universal` 特有逻辑,而是“renderer-backed pipeline asset”的通用职责。
|
||||
|
||||
### 2.2 Pipeline 执行骨架还没有提升成可复用抽象
|
||||
|
||||
当前 `UniversalRenderPipeline` 本质上只是:
|
||||
|
||||
1. 拿默认 renderer
|
||||
2. 转发 `SupportsStageRenderGraph`
|
||||
3. 转发 `RecordStageRenderGraph`
|
||||
|
||||
这层 forwarding 逻辑应该收成通用的 renderer-driven pipeline 基类,而不是继续散落在首方包里。
|
||||
|
||||
### 2.3 缺少 renderer execution 层自己的正式上下文对象
|
||||
|
||||
当前 renderer 执行时主要直接吃:
|
||||
|
||||
1. `ScriptableRenderContext`
|
||||
2. `RenderingData`
|
||||
|
||||
这能工作,但在 API 组织上还缺一个更明确的“renderer 正在做执行决策”的上下文层。
|
||||
|
||||
这一阶段先补最小集合:
|
||||
|
||||
1. `RendererRecordingContext`
|
||||
2. `RendererCameraRequestContext`
|
||||
|
||||
不扩 raw native API,只做 managed 组织骨架。
|
||||
|
||||
---
|
||||
|
||||
## 3. 实施方案
|
||||
|
||||
### 3.1 Universal 包新增通用 renderer-driven 基类
|
||||
|
||||
新增:
|
||||
|
||||
1. `RendererDrivenRenderPipeline`
|
||||
2. `RendererBackedRenderPipeline`
|
||||
3. `RendererBackedRenderPipelineAsset`
|
||||
|
||||
职责边界:
|
||||
|
||||
1. `RendererDrivenRenderPipeline` 负责 pipeline -> renderer execution delegation
|
||||
2. `RendererBackedRenderPipeline` 负责从 asset 解析默认 renderer
|
||||
3. `RendererBackedRenderPipelineAsset` 负责 rendererData 列表、默认选择、request/plan/backend key/runtime cleanup
|
||||
|
||||
### 3.2 Universal 迁移到通用骨架
|
||||
|
||||
重构:
|
||||
|
||||
1. `UniversalRenderPipelineAsset : RendererBackedRenderPipelineAsset`
|
||||
2. `UniversalRenderPipeline : RendererBackedRenderPipeline`
|
||||
3. `UniversalRenderPipelineAsset` 只保留 Universal 自己的默认 rendererData 初始化
|
||||
|
||||
### 3.3 补 execution context 类型
|
||||
|
||||
新增:
|
||||
|
||||
1. `RendererRecordingContext`
|
||||
2. `RendererCameraRequestContext`
|
||||
|
||||
这一步先做到:
|
||||
|
||||
1. 类型正式存在
|
||||
2. pipeline / renderer 内部可以开始用它们组织 execution seam
|
||||
3. 不强行扩大 public raw recording surface
|
||||
|
||||
### 3.4 用测试锁住新骨架
|
||||
|
||||
验证点:
|
||||
|
||||
1. API probe 能看到新类型
|
||||
2. Universal 行为不回退
|
||||
3. 通用 renderer-backed 骨架至少被现有 Universal 主链真实经过
|
||||
|
||||
---
|
||||
|
||||
## 4. 实施步骤
|
||||
|
||||
### Step 1:新增 renderer-driven 基类
|
||||
|
||||
目标:
|
||||
|
||||
1. 新增 `RendererDrivenRenderPipeline`
|
||||
2. 新增 `RendererBackedRenderPipeline`
|
||||
3. 新增 `RendererBackedRenderPipelineAsset`
|
||||
|
||||
### Step 2:迁移 Universal
|
||||
|
||||
目标:
|
||||
|
||||
1. `UniversalRenderPipelineAsset` 下放通用逻辑
|
||||
2. `UniversalRenderPipeline` 改成继承通用基类
|
||||
3. 保持现有 runtime / cleanup / default renderer 行为一致
|
||||
|
||||
### Step 3:补 execution context 类型
|
||||
|
||||
目标:
|
||||
|
||||
1. 新增 `RendererRecordingContext`
|
||||
2. 新增 `RendererCameraRequestContext`
|
||||
3. 在 renderer-driven 骨架里用起来
|
||||
|
||||
### Step 4:补测试与验证
|
||||
|
||||
目标:
|
||||
|
||||
1. 更新 `ScriptableRenderContextApiSurfaceProbe`
|
||||
2. 更新 `test_mono_script_runtime.cpp`
|
||||
3. 编译 `rendering_unit_tests`、`scripting_tests`、`XCEditor`
|
||||
4. 运行 old editor 10s 冒烟并检查新的 `SceneReady`
|
||||
|
||||
---
|
||||
|
||||
## 5. 验收标准
|
||||
|
||||
完成后应满足:
|
||||
|
||||
1. `Universal` 不再自己持有整套通用 renderer-backed asset 逻辑
|
||||
2. 存在正式的 `RendererDrivenRenderPipeline / RendererBackedRenderPipeline / RendererBackedRenderPipelineAsset`
|
||||
3. 存在正式的 `RendererRecordingContext / RendererCameraRequestContext`
|
||||
4. `Universal` 现有 request / plan / record 行为不回退
|
||||
5. `scripting_tests`、`rendering_unit_tests`、`XCEditor`、old editor 冒烟全部通过
|
||||
Reference in New Issue
Block a user