首页 > 解决方案 > D3D11_USAGE_STAGING,使用什么样的 GPU/CPU 内存?

问题描述

我阅读了D3D11 使用页面并来自 CUDA 背景,我想知道标记为的纹理D3D11_USAGE_STAGING将存储到哪种内存中。

我想在 CUDA 中它将被固定页面锁定的零拷贝内存。我测量了从ID3D11Texture2DwithD3D11_USAGE_STAGING到分配的主机缓冲区的传输时间malloc,它花费了将近 7 毫秒(在流媒体/游戏中相当多),我认为这将是从 GPU 全局内存到该内存区域所需的时间。

我的任何假设是否正确?什么D3D11_USAGE_STAGING用作 GPU 内存?

标签: windowsdirectxgpudirectx-11

解决方案


的主要用途D3D11_USAGE_STAGING是将数据加载到其他D3D11_USAGE_DEFAULT池资源中的一种方式。另一个常见的用法是将渲染目标“回读”到 CPU 可访问内存。您可以使用CopySubResourceRegion在 DEFAULT 和 STAGING 资源之间移动数据(离散硬件通常使用直接内存访问来处理系统内存和 VRAM 之间的数据移动)。

这是一个概括,因为它取决于架构和驱动程序的选择,但简而言之::

  • D3D11_USAGE_STAGING意思是放到系统内存中,GPU不能访问。

  • D3D11_USAGE_DEFAULT把它放在VRAM中,CPU不能访问它。要将数据放入其中,需要从 STAGING 资源中复制数据。您可以将其UpdateSubresource视为创建 STAGING 资源、将数据复制到其中、从 STAGING 复制到 DEFAULT,然后释放 STAGING 副本的便捷函数。

    • DirectX 11.2 或更高版本中有一个可选功能,如果驱动程序选择允许 CPU 访问甚至D3D11_USAGE_DEFAULT池内容,则驱动程序可以实现该功能。这取决于他们如何设置内存系统(即在统一内存架构中,系统 RAM 和 VRAM 是同一回事)。
  • D3D11_USAGE_IMMUTABLE与 基本相同D3D11_USAGE_DEFAULT,但您是说您只会在创建调用中对其进行一次初始化。

  • D3D11_USAGE_DYNAMIC意味着把它放在共享系统内存中,CPU和GPU都需要访问它。与 DEFAULT 相比,GPU 从中读取通常会降低性能,因此您希望谨慎使用它。它确实适用于您在 CPU 上生成每一帧然后需要渲染的东西(例如地形系统或程序几何)。

使用内容流的游戏通常具有一组 STAGING 纹理,它们在后台将数据加载到其中,然后DEFAULT在它们可用于高效渲染时将其复制到纹理中。这使他们可以重用 STAGING 和 DEFAULT 纹理,而无需每帧销毁/创建资源的开销。

请参阅 Microsoft Docs 上这篇有些过时的文章:资源管理最佳实践


推荐阅读