2.4 KiB
2.4 KiB
RHIDevice::CreateBuffer
命名空间: XCEngine::RHI
类型: method
头文件: XCEngine/RHI/RHIDevice.h
签名
virtual RHIBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual RHIBuffer* CreateBuffer(
const BufferDesc& desc,
const void* initialData,
size_t initialDataSize,
ResourceStates finalState = ResourceStates::GenericRead);
作用
创建 RHIBuffer。基础重载只创建资源本体;带初始数据的重载额外负责把给定字节流写入缓冲,并把资源切换到目标状态。
默认实现语义
抽象基类只把第一种重载保留为纯虚接口。第二种重载在基类里已经提供了统一默认实现,流程如下:
- 如果没有初始数据,直接转发到
CreateBuffer(desc)。 - 如果
initialDataSize > desc.size,返回nullptr。 - 创建基础缓冲。
- 通过
RHIBuffer::SetData写入初始数据。 - 如果缓冲比初始数据更大,则把剩余区域补零。
- 调用
SetState(finalState),让返回对象带着上层期望的资源状态离开工厂。
这意味着“带初始化数据的创建”在抽象层已经成为正式契约,而不是某个后端的私有便利函数。
设计意图
这个重载的价值不是取代完整的上传系统,而是给渲染器、资源加载器和测试代码一个统一、直接的入口:
- 小型静态常量缓冲和顶点数据可以一步创建完成。
- 各后端都能保留自己的最佳实现空间。
- 上层不需要为“先建空缓冲,再手动上传”重复铺设样板逻辑。
商业引擎底层通常都会保留这种“便捷初始化路径”,因为它能降低资源引导阶段的复杂度;真正的大规模流式上传则仍然会走专门的上传器和队列系统。
后端实现差异
D3D12Device已经重写该重载,使用上传缓冲和拷贝命令完成初始化,而不是依赖默认的SetData路径。- 其他设备实现可以继续继承默认语义,也可以在需要时重写以获得更好的性能或更严格的状态控制。
使用建议
- 适合启动期、测试、工具链或中小型静态数据。
- 不要把它当成高频 streaming API。
- 调用方仍然负责对象生命周期管理:成功返回后需要在合适时机
Shutdown()并销毁缓冲。