使用堆类型上载更新GPU资源的最佳方法是什么?

时间:2017-01-22 13:40:07

标签: directx-12 direct3d12

我使用ID3D12Resource::Map方法更新GPU资源。这是最有效的方式吗?有哪些替代方案?

1 个答案:

答案 0 :(得分:5)

上传堆资源具有相关的读取成本,高于默认资源。

对于常量缓冲区,这通常很好(因为您处于一次写入/一次读取的情况),但在其他情况下(大型顶点/索引缓冲区),这通常是不可取的。

一般方法是创建两个资源(一个在上传堆中,一个在默认堆中),将数据复制到上载资源(使用您提到的map),然后使用{{3}执行gpu复制默认资源中的{}或CopyResource

请确保在资源复制之前/之后使用CopyBufferRegion和过渡状态设置了正确的资源状态。

在调用copy之前,资源应该在复制之前在D3D12_RESOURCE_STATE_COPY_DEST中,以及任何依赖于资源的读取标志。

另请注意,您可以使用复制命令队列进行GPU复制(这样可以避免在直接命令列表中执行),但是您需要确保在使用资源之前完成复制(通过使用Fences)。

多引擎在msdn ResourceBarrier

中描述