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:
2026-04-20 02:48:16 +08:00
parent 5e88449e3d
commit d196ec9264
5 changed files with 466 additions and 24 deletions

View 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 编译、测试、冒烟全部通过