docs: close editor viewport host phase

This commit is contained in:
2026-04-01 21:50:58 +08:00
parent 846666bb2c
commit 784af81b07
2 changed files with 129 additions and 3 deletions

View File

@@ -0,0 +1,128 @@
# Editor Viewport 宿主渲染收口总结 4.1
## 当前判断
截至 2026-04-01这一阶段的主线应视为
-`Editor -> ViewportHost -> Renderer -> RHI` 这条链路接通
- 把 editor viewport 的宿主层从 panel 内部逻辑中收出来
- 把这层宿主代码压到“可继续演进,但先停止扩张”的状态
这一阶段的目标不是继续往 editor viewport 里塞更多功能,也不是提前做完未来 renderer 的全部能力。
如果继续在本阶段里混入 gizmo 完整体系、GPU picking 正式方案、多 pass 大改、后处理、光照系统等内容,只会让阶段边界再次失控。
## 已完成的收口结果
### 1. editor viewport 已经不再是空壳
当前 `SceneView``GameView` 已经能通过统一的 viewport host 路径请求离屏 render target并把 renderer 输出展示到 editor 面板中。
当前已实际接通:
- Scene viewport 渲染
- Game viewport 渲染
- viewport resize 资源重建
- backpack 等真实模型内容在 editor 中显示
- grid / 选中 / 描边 / object id 读取链路
### 2. viewport host 的职责边界已经成型
当前 viewport 宿主层已经被拆成几块相对明确的职责:
- [editor/src/Viewport/ViewportHostSurfaceUtils.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportHostSurfaceUtils.h)
- viewport surface / texture / reuse 相关纯工具
- [editor/src/Viewport/ViewportHostRenderTargets.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportHostRenderTargets.h)
- viewport render target 生命周期与创建销毁
- [editor/src/Viewport/ViewportObjectIdPicker.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportObjectIdPicker.h)
- viewport object id 读取与像素映射
- [editor/src/Viewport/ViewportHostRenderFlowUtils.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportHostRenderFlowUtils.h)
- scene/game viewport 的失败回退策略、request 组装、成功态迁移
- [editor/src/Viewport/ViewportHostService.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportHostService.h)
- 保留真正的 orchestration、scene view camera、post pass 组装与 clear 执行
这意味着 viewport host 已经不再是“一个面板私有的大杂烩类”,而是一个有明确宿主边界的 editor 侧接入层。
### 3. 现阶段测试闭环已经补上
当前 editor 侧已经有明确的宿主层单测覆盖:
- [tests/editor/test_viewport_host_surface_utils.cpp](D:/Xuanchi/Main/XCEngine/tests/editor/test_viewport_host_surface_utils.cpp)
- [tests/editor/test_viewport_render_targets.cpp](D:/Xuanchi/Main/XCEngine/tests/editor/test_viewport_render_targets.cpp)
- [tests/editor/test_viewport_object_id_picker.cpp](D:/Xuanchi/Main/XCEngine/tests/editor/test_viewport_object_id_picker.cpp)
- [tests/editor/test_viewport_render_flow_utils.cpp](D:/Xuanchi/Main/XCEngine/tests/editor/test_viewport_render_flow_utils.cpp)
本轮收口完成后,`editor_tests` 已覆盖 viewport host 中最容易回归的纯策略与资源管理逻辑。
## 为什么到这里应当停止继续拆
当前 [editor/src/Viewport/ViewportHostService.h](D:/Xuanchi/Main/XCEngine/editor/src/Viewport/ViewportHostService.h) 剩下的主要内容,是以下几类“真正属于宿主编排”的职责:
- scene view camera 的创建与驱动
- focus / orientation axis 等 editor 专属视图控制
- scene view post pass 的装配
- scene/game viewport 的 render dispatch
- clear 执行
这些逻辑如果继续硬拆,很容易为了“文件更小”而把真正依赖 editor 运行时状态的 orchestration 人为打散,收益已经明显下降。
所以这一阶段的明确结论是:
- `ViewportHostService` 继续保持为宿主编排入口是合理的
- 不再以“继续拆文件”为本阶段目标
- 下一阶段应把重点转移到 renderer 本身的演进,而不是继续挤压 editor host
## 本阶段的结束标准
这一阶段以以下标准视为完成:
1. `editor_tests` 全部通过
2. `XCEditor` 能正常编译
3. viewport host 的主要纯逻辑都有独立单测
4. `ViewportHostService` 不再继续承载资源创建、object id 读取、失败策略等细碎职责
5. 明确哪些问题属于后续 renderer 阶段,而不是继续留在当前阶段消耗
## 明确不属于本阶段的内容
以下内容不再计入“editor viewport 宿主渲染收口”阶段:
- GPU object id 正式拾取方案
- renderer 内部通用多 pass / render graph 体系
- 更正式的 editor outline 方案升级
- gizmo 全量产品化
- 光照、阴影、后处理
- runtime 渲染管线的完整 SRP 式抽象
这些内容应进入 renderer 后续阶段,而不是继续塞回当前 viewport host 收口任务。
## 下一阶段建议
下一阶段主线应转为:
### 1. renderer 能力继续上移
把目前 editor 层为了接通 viewport 而保留的一些临时职责,逐步让 renderer 吸收为正式能力,例如:
- 多 pass 组织能力
- 正式的 object id / editor helper pass 接口
- editor 与 runtime 共享的 camera render path
### 2. editor 只消费 renderer 提供的正式输出
editor viewport 后续应更多扮演:
- render target 宿主
- 输入转发
- overlay / gizmo 宿主
- editor 专属交互入口
而不是继续承载 renderer 内部演进本体。
## 阶段性结论
这一阶段现在可以正式收口:
- editor viewport 已经从“空面板”进入“真实宿主层”
- renderer 与 RHI 已经能稳定把离屏结果送进 editor
- viewport host 的边界已经明确
- 后续不应继续在本阶段内部无限拆分,而应切换到 renderer 下一阶段

View File

@@ -25,15 +25,13 @@
#include <XCEngine/Rendering/SceneRenderer.h> #include <XCEngine/Rendering/SceneRenderer.h>
#include <XCEngine/Scene/Scene.h> #include <XCEngine/Scene/Scene.h>
#include <algorithm>
#include <array> #include <array>
#include <cmath>
#include <cstdint> #include <cstdint>
#include <cstring>
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include <vector>
namespace XCEngine { namespace XCEngine {
namespace Editor { namespace Editor {