使用堆类型上传更新GPU资源的最佳方式是什么



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

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

在常量缓冲区的情况下,这通常是可以的(就像在一次写入/一次读取的场景中一样),但在其他情况下(大型顶点/索引缓冲区),这通常不可取。

一种通用的方法是创建两个资源(一个在上传堆中,一个在默认堆中),将数据复制到上传资源中(使用您提到的映射),然后在默认资源中使用CopyResource或CopyBufferRegion执行gpu复制。

请确保在资源复制之前/之后,使用ResourceBarrier和转换状态设置了正确的资源状态。

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

还请注意,您可以为GPU副本使用复制命令队列(这样您就可以避免在"直接命令"列表中执行),但您需要确保在使用资源之前完成复制(通过使用围栏)。

多引擎描述在msdn这里

最新更新