0

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

4

1 回答 1

7

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

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

一种通用的方法是创建两个资源(一个在上传堆中,一个在默认堆中),将数据复制到上传资源中(使用您提到的地图),然后在默认情况下使用CopyResourceCopyBufferRegion执行 gpu 复制资源。

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

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

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

多引擎在这里的 msdn 中有描述

于 2017-02-23T15:07:17.530 回答