refactor(srp): add renderer data invalidation seam
Introduce ScriptableRendererData dirty/invalidation support so renderer and feature caches can be released and rebuilt within the same managed asset runtime. Add managed probes and scripting coverage for non-public dirty APIs and for renderer rebuild after invalidation, then archive the completed phase plan.
This commit is contained in:
139
docs/used/SRP_RendererData失效与重建接缝计划_2026-04-20.md
Normal file
139
docs/used/SRP_RendererData失效与重建接缝计划_2026-04-20.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# SRP RendererData 失效与重建接缝计划 2026-04-20
|
||||
|
||||
## 1. 阶段目标
|
||||
|
||||
上一阶段已经把 renderer feature setup 正式归位到:
|
||||
|
||||
`ScriptableRendererData -> ScriptableRenderer`
|
||||
|
||||
但现在还缺最后一条关键闭环:
|
||||
|
||||
当同一个 `ScriptableRendererData` 被修改后,旧的 renderer cache 该怎么失效,以及下一次使用时怎么重建。
|
||||
|
||||
当前系统只在更大的生命周期边界清缓存:
|
||||
|
||||
1. asset runtime 释放
|
||||
2. bridge generation 变化
|
||||
3. managed pipeline dispose
|
||||
|
||||
这意味着“同一个 asset 还活着,但 renderer data 已经变了”的情况,还没有正式 contract。
|
||||
|
||||
这一阶段的目标就是补上 Unity 风格的 renderer data invalidation seam。
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前问题
|
||||
|
||||
### 2.1 renderer cache 只能在 runtime release 时整体释放
|
||||
|
||||
现在 `ScriptableRendererData` 已经缓存:
|
||||
|
||||
1. renderer instance
|
||||
2. renderer feature cache
|
||||
|
||||
但没有一个正式的“我变脏了,请把这套 renderer setup 丢掉”的入口。
|
||||
|
||||
### 2.2 同 asset、同 runtime 内部缺少 renderer rebuild 语义
|
||||
|
||||
对于后续编辑器和 SRP/URP 包来说,很常见的场景是:
|
||||
|
||||
1. 还在用同一个 pipeline asset
|
||||
2. 只是改了 renderer data
|
||||
3. 希望下一次录制时重建 renderer
|
||||
|
||||
这一层现在还只能靠 asset/runtime 整体重建绕过去。
|
||||
|
||||
### 2.3 测试还没锁住“同一个 runtime 内触发 renderer rebuild”
|
||||
|
||||
现有测试已经锁了:
|
||||
|
||||
1. renderer reuse
|
||||
2. 生命周期 release
|
||||
3. setup seam
|
||||
|
||||
但还没锁“同一个 asset runtime 内,dirty 之后旧 renderer dispose,新 renderer rebuild”。
|
||||
|
||||
---
|
||||
|
||||
## 3. 实施方案
|
||||
|
||||
### 3.1 给 `ScriptableRendererData` 增加正式 invalidation seam
|
||||
|
||||
新增非 public / protected 语义:
|
||||
|
||||
1. `SetDirty()`
|
||||
2. `isInvalidated`
|
||||
|
||||
`SetDirty()` 负责:
|
||||
|
||||
1. 释放当前 renderer cache
|
||||
2. 释放当前 feature cache
|
||||
3. 标记 data 已失效
|
||||
|
||||
### 3.2 renderer 下一次解析时自动重建
|
||||
|
||||
保持调用面不变:
|
||||
|
||||
`GetRendererInstance()`
|
||||
|
||||
但在 dirty 之后,下一次解析 renderer 时应:
|
||||
|
||||
1. 重新创建 renderer
|
||||
2. 重新 setup renderer
|
||||
3. 清掉 invalidated 状态
|
||||
|
||||
### 3.3 用 probe 锁住同 asset runtime 内的 rebuild 行为
|
||||
|
||||
新增一个专用 probe:
|
||||
|
||||
1. 第一次 `SupportsStageRenderGraph` 创建 renderer
|
||||
2. 运行时通过同一个 managed asset 调用 renderer data invalidation
|
||||
3. 第二次 `SupportsStageRenderGraph` 在同一个 asset runtime 里重建 renderer
|
||||
|
||||
---
|
||||
|
||||
## 4. 实施步骤
|
||||
|
||||
### Step 1:补 core invalidation seam
|
||||
|
||||
目标:
|
||||
|
||||
1. 修改 `ScriptableRendererData`
|
||||
2. 引入 renderer/feature cache 的单独释放辅助逻辑
|
||||
3. 增加 `SetDirty()` 与 `isInvalidated`
|
||||
|
||||
### Step 2:补 invalidation probe
|
||||
|
||||
目标:
|
||||
|
||||
1. 在 `RenderPipelineApiProbe.cs` 增加 renderer invalidation 专用 asset / renderer data / renderer / feature / 观察脚本
|
||||
2. 用同一个 managed asset handle 触发 invalidation
|
||||
|
||||
### Step 3:补 API probe 与脚本测试
|
||||
|
||||
目标:
|
||||
|
||||
1. 更新 `ScriptableRenderContextApiSurfaceProbe.cs`
|
||||
2. 更新 `test_mono_script_runtime.cpp`
|
||||
3. 锁住 dirty 之后的 create/setup/dispose 计数
|
||||
|
||||
### Step 4:验证与收口
|
||||
|
||||
目标:
|
||||
|
||||
1. 编译 `rendering_unit_tests`、`scripting_tests`、`XCEditor`
|
||||
2. 跑测试
|
||||
3. 跑旧版 `editor/bin/Debug/XCEngine.exe` 10s 冒烟并检查新的 `SceneReady`
|
||||
4. 归档 plan,提交并推送
|
||||
|
||||
---
|
||||
|
||||
## 5. 验收标准
|
||||
|
||||
完成后应满足:
|
||||
|
||||
1. `ScriptableRendererData` 存在正式 dirty / invalidated seam
|
||||
2. dirty 之后旧 renderer cache 和 feature cache 会被释放
|
||||
3. 同一个 asset runtime 内下一次解析 renderer 时会自动重建
|
||||
4. probe / scripting test 锁住重建行为
|
||||
5. old editor 编译、测试、冒烟全部通过
|
||||
Reference in New Issue
Block a user