7.8 KiB
7.8 KiB
RHI
命名空间: XCEngine::RHI
类型: module
描述: 提供渲染硬件抽象层、后端选择入口、资源与命令提交接口,以及跨后端共享的描述符和枚举定义。
概览
XCEngine::RHI 是当前引擎渲染栈里最靠近图形 API 的一层。它的职责不是提供高层渲染功能,而是把 D3D12、OpenGL 等后端收敛到一组共同接口之下:
- RHIFactory 负责选择并创建具体后端设备。
- RHIDevice 是核心抽象入口,承担“设备对象 + 资源工厂”的双重职责。
- RHICommandQueue 和 RHICommandList 负责提交与记录 GPU 工作。
- RHITypes 和 RHIEnums 定义跨后端共享的描述符语言。
如果拿商用引擎做类比,这层更接近 Unreal 风格的低层 RHI / render backend,而不是 Unity 面向 gameplay 的公共渲染 API。Unity 普通业务层一般不会直接碰设备、命令队列、资源视图;而 XCEngine 当前把这些对象直接暴露给引擎上层、测试和后端验证代码,用来支撑渲染系统构建、后端 bring-up 和图形测试。
当前架构理解
当前源码呈现出的主链路大致是:
- 通过 RHIFactory 选择后端。
- 通过 RHIDevice 初始化设备并查询 RHICapabilities。
- 用
RHIDevice创建队列、命令列表、buffer、texture、render pass、pipeline state、descriptor pool / set 等对象。 - 在 RHICommandList 上录制状态设置、clear、copy、draw、dispatch。
- 通过 RHICommandQueue 提交并用 RHIFence 同步。
这套设计的好处是:
- 对接新后端时,上层接口面比较稳定。
- 单元测试和集成测试可以直接验证抽象层行为。
- 渲染模块可以在这一层之上继续搭更高层的 renderer、frame graph 或材质系统。
代价也很明确:
- 接口比较显式,样板代码多。
- 抽象层并不完全“纯净”,仍能看到 D3D12 / OpenGL 风格痕迹。
- 当前版本大量对象仍采用裸指针所有权,文档必须把生命周期约束写清楚。
后端可用性
按当前源码而不是设计愿景来看,RHIFactory 的真实后端可用性是:
D3D12: 当前工厂始终可创建,是默认最完整的桌面后端之一。OpenGL: 仅在编译时定义XCENGINE_SUPPORT_OPENGL时可创建。Vulkan: 仅在编译时定义XCENGINE_SUPPORT_VULKAN时可创建。Metal:RHIType中已有枚举项,但当前工厂直接返回nullptr。
这说明 RHIType 代表的是“抽象层计划支持的后端集合”,不等于“当前构建一定可用的后端集合”。
所有权与生命周期
这是 RHI 模块里最重要的使用约定之一。
当前抽象层大量 API 都返回裸指针,包括:
RHIFactory::CreateRHIDevice()RHIDevice::CreateBuffer()/CreateTexture()/CreateCommandList()/CreateCommandQueue()等- descriptor pool、descriptor set、render pass、framebuffer、sampler、fence、resource view 等
按当前测试和调用模式,推荐把它们理解为:
- 由创建者拥有返回对象。
- 使用结束前先调用对象自己的
Shutdown()。 - 然后再
delete。
也就是说,这一层目前不是 Core::Ref / RAII 优先的风格,而是更接近底层图形资源包装常见的“显式关闭 + 显式释放”模式。
设计现实与实现边界
当前 RHI 抽象层已经能表达核心 GPU 对象,但它还不是一个完全收敛的、无后端泄漏的终态接口:
- RHITypes 里既有通用描述符,也有明显偏 D3D12 的结构名,例如
RootSignatureDesc、DescriptorHeapDesc、CommandAllocatorDesc。 - RHICommandList 同时暴露了 render pass、render target、descriptor set、copy、draw、dispatch 等多种路径,混合了不同代际的抽象思路。
- RHICommandQueue 的
ExecuteCommandLists()采用void**,说明抽象层仍带有一定后端适配痕迹。 Metal仍是占位,Vulkan目录也还在逐步补全文档。
这并不意味着设计错误。对一个正在演进的商业级引擎来说,更现实的路径通常就是先把“能支撑后端实现和测试”的抽象做出来,再逐步收敛接口一致性。
后端目录
顶层头文件
- RHIBuffer -
RHIBuffer.h,buffer 抽象资源接口。 - RHICapabilities -
RHICapabilities.h,设备能力与限制信息。 - RHICommandList -
RHICommandList.h,命令录制接口。 - RHICommandQueue -
RHICommandQueue.h,命令提交与同步接口。 - RHIDescriptorPool -
RHIDescriptorPool.h,descriptor set 分配池。 - RHIDescriptorSet -
RHIDescriptorSet.h,资源绑定集合。 - RHIDevice -
RHIDevice.h,抽象设备与对象工厂。 - RHIEnums -
RHIEnums.h,跨后端共享枚举。 - RHIFactory -
RHIFactory.h,后端选择入口。 - RHIFence -
RHIFence.h,GPU 同步原语。 - RHIFramebuffer -
RHIFramebuffer.h,帧缓冲对象。 - RHIPipelineLayout -
RHIPipelineLayout.h,资源绑定布局。 - RHIPipelineState -
RHIPipelineState.h,图形/计算管线状态。 - RHIRenderPass -
RHIRenderPass.h,render pass 描述与句柄。 - RHIResource -
RHIResource.h,资源基类接口。 - RHIResourceView -
RHIResourceView.h,资源视图接口。 - RHISampler -
RHISampler.h,采样器对象。 - RHIScreenshot -
RHIScreenshot.h,截图接口。 - RHIShader -
RHIShader.h,shader 抽象。 - RHISwapChain -
RHISwapChain.h,窗口展示交换链。 - RHITexture -
RHITexture.h,texture 抽象资源接口。 - RHITypes -
RHITypes.h,共享描述符与辅助结构。
推荐阅读顺序
- 先读 Devices, Queues, Command Lists, And Resource Creation,建立正确心智模型。
- 再读 RHIFactory 和 RHIDevice,理解后端选择和对象创建。
- 然后读 RHICommandQueue 与 RHICommandList,理解录制与提交。
- 最后再查 RHITypes、RHIEnums、RHICapabilities 这些通用支持页。
相关指南
- Devices, Queues, Command Lists, And Resource Creation - 解释当前 RHI 的真实使用路径、生命周期约束以及和 Unity / 商用引擎常见设计的对应关系。