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

What is the best way to update GPU resource with heap type upload?

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

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

在常量缓冲区的情况下,这通常没问题(因为您在写 once/read 一次的情况下),但在其他情况下(大 Vertex/Index 缓冲区),这通常是不可取的.

一般方法是创建两个资源(一个在上传堆中,一个在默认堆中),将数据复制到上传资源中(使用您提到的地图),然后使用 CopyResource or CopyBufferRegion 在默认资源中。

请确保您使用 ResourceBarrier 和过渡状态设置了正确的资源状态 before/after 资源副本。

在调用复制之前,资源应该在复制之前D3D12_RESOURCE_STATE_COPY_DEST,并且任何依赖于你的资源的读取标志。

另请注意,您可以使用 Copy Command 队列进行 GPU 复制(这样可以避免在 Direct Command 列表中执行),但您需要确保复制完成后才能使用资源(通过使用 Fences)。

msdn中描述了多引擎here