语法
参数
Subresource类型:UINT 指定子资源的索引编号。 pReadRange [in, optional]
类型:const D3D12_RANGE * 指向 D3D12_RANGE 结构的指针,该结构描述要访问的内存范围。 这表示 CPU 可能读取的区域,坐标相对于子资源。空指针表示 CPU 可能会读取整个子资源。通过传递 End 小于或等于 Begin 的范围来指定 CPU 不会读取任何数据是有效的。 ppData [out, optional]
类型:void ** 指向一个内存块的指针,该内存块接收指向资源数据的指针。 空指针也是有效的,可用于缓存 CPU 虚拟地址范围,供 WriteToSubresource 等方法使用。当 ppData 不为 NULL 时,返回的指针永远不会因 pReadRange 中的任何值而发生偏移。
返回值
类型:HRESULT 此方法返回 Direct3D 12 返回代码之一。备注
Map 和 Unmap 可由多个线程安全地调用。支持嵌套的 Map 调用,并使用引用计数。首次调用 Map 时会为该资源分配一个 CPU 虚拟地址范围。最后一次调用 Unmap 时会释放该 CPU 虚拟地址范围。CPU 虚拟地址通常会返回给应用程序;但操纵具有未知布局的纹理内容将不允许公开该 CPU 虚拟地址。有关详细信息,请参阅 WriteToSubresource。除非 Map 一直保持嵌套状态,否则应用程序不能依赖该地址的一致性。 Map 返回的指针不保证具有普通指针的所有功能,但大多数应用程序在正常使用中不会察觉到差异。例如,具有 WRITE_COMBINE 行为的指针相比 WRITE_BACK 行为具有较弱的 CPU 内存排序保证。由于 PCIe 的限制,CPU 和 GPU 都可访问的内存不保证与 CPU 具有相同的原子内存保证。请使用围栏进行同步。 Map 有两类使用模型:简单和高级。简单使用模型可以最大化工具的性能,因此建议应用程序坚持使用简单模型,除非应用程序确定确实需要高级模型。简单使用模型
应用程序应坚持使用 UPLOAD、DEFAULT 和 READBACK 这些堆类型抽象,以便合理地支持所有适配器架构。 应用程序应避免对 UPLOAD 堆上的资源指针进行 CPU 读取,甚至是意外读取。CPU 读取虽然可以工作,但在许多常见的 GPU 架构上速度慢得令人无法接受,因此需要考虑以下事项:- 不要让 CPU 从与 D3D12_HEAP_TYPE_UPLOAD 或具有 D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE 的堆关联的资源进行读取。
- pData 指向的内存区域可能以 PAGE_WRITECOMBINE 分配,你的应用必须遵守与此类内存关联的所有限制。
- 即使是下面的 C++ 代码也可以从内存中读取并触发性能损失,因为该代码可以展开为以下 x86 汇编代码。C++ 代码:x86 汇编代码:
- 使用合适的优化设置和语言结构以避免这种性能损失。例如,可以使用 volatile 指针,或针对代码速度而非代码大小进行优化,从而避免异或优化。
高级使用模型
CPU 可访问堆上的资源可以持久映射,也就是说 Map 可以在资源创建后立即调用一次。永远不需要调用 Unmap,但在最后一次引用该资源被释放后,不得再使用从 Map 返回的地址。使用持久映射时,应用程序必须确保 CPU 在 GPU 执行读取或写入该内存的命令列表之前已完成向内存写入数据。在常见场景中,应用程序只需在调用 ExecuteCommandLists 之前写入内存;但使用围栏来延迟命令列表执行同样有效。 所有 CPU 可访问内存类型都支持持久映射用法,即资源已映射但从未取消映射,前提是应用程序在资源被销毁后不再访问该指针。示例
D3D12Bundles 示例按如下方式使用 ID3D12Resource::Map: 将三角形数据复制到顶点缓冲区。要求
头文件: d3d12_xs.h 或 d3d12_x.h库: d3d12_xs.lib 或 d3d12_x.lib
支持的平台:XBOX Series 主机和 XBOX One 系列
