Files
XCEngine/docs/api/XCEngine/RHI/RHI.md
2026-03-29 01:36:53 +08:00

7.8 KiB
Raw Blame History

RHI

命名空间: XCEngine::RHI

类型: module

描述: 提供渲染硬件抽象层、后端选择入口、资源与命令提交接口,以及跨后端共享的描述符和枚举定义。

概览

XCEngine::RHI 是当前引擎渲染栈里最靠近图形 API 的一层。它的职责不是提供高层渲染功能,而是把 D3D12、OpenGL 等后端收敛到一组共同接口之下:

如果拿商用引擎做类比,这层更接近 Unreal 风格的低层 RHI / render backend而不是 Unity 面向 gameplay 的公共渲染 API。Unity 普通业务层一般不会直接碰设备、命令队列、资源视图;而 XCEngine 当前把这些对象直接暴露给引擎上层、测试和后端验证代码,用来支撑渲染系统构建、后端 bring-up 和图形测试。

当前架构理解

当前源码呈现出的主链路大致是:

  1. 通过 RHIFactory 选择后端。
  2. 通过 RHIDevice 初始化设备并查询 RHICapabilities
  3. RHIDevice 创建队列、命令列表、buffer、texture、render pass、pipeline state、descriptor pool / set 等对象。
  4. RHICommandList 上录制状态设置、clear、copy、draw、dispatch。
  5. 通过 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 等

按当前测试和调用模式,推荐把它们理解为:

  1. 由创建者拥有返回对象。
  2. 使用结束前先调用对象自己的 Shutdown()
  3. 然后再 delete

也就是说,这一层目前不是 Core::Ref / RAII 优先的风格,而是更接近底层图形资源包装常见的“显式关闭 + 显式释放”模式。

设计现实与实现边界

当前 RHI 抽象层已经能表达核心 GPU 对象,但它还不是一个完全收敛的、无后端泄漏的终态接口:

  • RHITypes 里既有通用描述符,也有明显偏 D3D12 的结构名,例如 RootSignatureDescDescriptorHeapDescCommandAllocatorDesc
  • RHICommandList 同时暴露了 render pass、render target、descriptor set、copy、draw、dispatch 等多种路径,混合了不同代际的抽象思路。
  • RHICommandQueueExecuteCommandLists() 采用 void**,说明抽象层仍带有一定后端适配痕迹。
  • Metal 仍是占位,Vulkan 目录也还在逐步补全文档。

这并不意味着设计错误。对一个正在演进的商业级引擎来说,更现实的路径通常就是先把“能支撑后端实现和测试”的抽象做出来,再逐步收敛接口一致性。

后端目录

  • D3D12 - Direct3D 12 后端实现。
  • OpenGL - OpenGL 后端实现。
  • Vulkan - 头文件目录已存在,当前 canonical 文档仍在补建中。

顶层头文件

推荐阅读顺序

  1. 先读 Devices, Queues, Command Lists, And Resource Creation,建立正确心智模型。
  2. 再读 RHIFactoryRHIDevice,理解后端选择和对象创建。
  3. 然后读 RHICommandQueueRHICommandList,理解录制与提交。
  4. 最后再查 RHITypesRHIEnumsRHICapabilities 这些通用支持页。

相关指南

相关文档