3.2 KiB
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,d3d12OpenGL,opengl,GLVulkan,vulkan,VK,vk
如果名字不匹配,或者对应后端没有编译进当前构建,工厂会返回 nullptr。
所有权约定
CreateRHIDevice() 返回的是裸指针。按当前测试和调用习惯,调用方负责:
- 判断返回值是否为空。
- 调用
Initialize()完成设备初始化。 - 使用完毕后先
Shutdown()。 - 最后
delete。
这一点必须显式记住,因为它和 Core 模块里常见的 Ref<T> / UniqueRef<T> 使用习惯不同。
当前设计边界
RHIFactory 当前是一个非常薄的入口,因此它没有提供下面这些商业引擎常见增强能力:
- 没有“选择首选后端,否则回退到次选后端”的策略接口。
- 没有适配器探测或按能力自动挑选设备。
- 没有插件式后端注册。
- 没有返回错误原因,只有
nullptr。
这不是缺陷掩盖,而是当前实现范围确实比较收敛。它的职责只是“根据已知后端名创建一个设备对象”。
公共方法
- CreateRHIDevice - 根据
RHIType或后端名称创建抽象设备实例。