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

3.2 KiB

RHIFactory

命名空间: XCEngine::RHI

类型: class

头文件: XCEngine/RHI/RHIFactory.h

描述: 提供统一的 RHI 后端选择入口,根据枚举或字符串创建具体 RHIDevice 实现。

角色概述

RHIFactory 是当前抽象层的引导入口。它的价值不在于复杂逻辑,而在于把“上层代码如何选中某个图形后端”这件事收敛到一个稳定入口里:

  • 测试代码可以按参数切换 D3D12 / OpenGL / Vulkan。
  • 引擎启动流程不需要直接 #include 某个具体后端设备头。
  • 以后如果要接配置文件、命令行或编辑器选项,也可以继续沿用这个入口。

这类工厂在商用引擎里很常见,因为“后端选择”通常是启动层问题,而不是渲染业务层问题。

当前创建语义

RHIFactory 只暴露两个静态重载:

  • CreateRHIDevice(RHIType type)
  • CreateRHIDevice(const std::string& typeName)

它们都会直接 new 出具体后端设备,并返回 RHIDevice*。当前没有智能指针包装,也没有注册表或插件发现机制。

后端可用性

按当前 engine/src/RHI/RHIFactory.cpp 的实现,真实行为是:

  • RHIType::D3D12 始终返回 new D3D12Device()
  • RHIType::OpenGL 只有在定义 XCENGINE_SUPPORT_OPENGL 时才会返回 new OpenGLDevice()
  • RHIType::Vulkan 只有在定义 XCENGINE_SUPPORT_VULKAN 时才会返回 new VulkanDevice()
  • RHIType::Metal 当前直接返回 nullptr

这和很多商业引擎的“平台编译开关决定后端可用集合”是一致的,但当前实现还没有提供更友好的 fallback 策略。

字符串重载支持的名称

字符串重载当前支持的别名是源码硬编码的:

  • D3D12, d3d12
  • OpenGL, opengl, GL
  • Vulkan, vulkan, VK, vk

如果名字不匹配,或者对应后端没有编译进当前构建,工厂会返回 nullptr

所有权约定

CreateRHIDevice() 返回的是裸指针。按当前测试和调用习惯,调用方负责:

  1. 判断返回值是否为空。
  2. 调用 Initialize() 完成设备初始化。
  3. 使用完毕后先 Shutdown()
  4. 最后 delete

这一点必须显式记住,因为它和 Core 模块里常见的 Ref<T> / UniqueRef<T> 使用习惯不同。

当前设计边界

RHIFactory 当前是一个非常薄的入口,因此它没有提供下面这些商业引擎常见增强能力:

  • 没有“选择首选后端,否则回退到次选后端”的策略接口。
  • 没有适配器探测或按能力自动挑选设备。
  • 没有插件式后端注册。
  • 没有返回错误原因,只有 nullptr

这不是缺陷掩盖,而是当前实现范围确实比较收敛。它的职责只是“根据已知后端名创建一个设备对象”。

公共方法

  • CreateRHIDevice - 根据 RHIType 或后端名称创建抽象设备实例。

相关指南

相关文档