D3D11_USAGE_STAGING,使用什么样的GPU/CPU内存?

D3D11_USAGE_STAGING, what kind of GPU/CPU memory is used?

我阅读了 D3D11 Usage 页面并且来自 CUDA 背景 我想知道标记为 D3D11_USAGE_STAGING 的纹理将存储到什么样的内存中。

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

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

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

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

  • D3D11_USAGE_STAGING表示放在系统内存中,GPU无法访问。

  • D3D11_USAGE_DEFAULT放在显存里,CPU访问不了。要将数据放入其中,需要从 STAGING 资源复制数据。您可以将 UpdateSubresource 视为创建 STAGING 资源的便利函数,将数据复制到其中,从 STAGING 复制到 DEFAULT,然后释放 STAGING 副本。

    • DirectX 11.2 或更高版本中有一个可选功能,如果他们选择允许 CPU 访问甚至 D3D11_USAGE_DEFAULT 池内容,驱动程序可以实现。这取决于他们如何设置内存系统(即在 Unified Memory Architectures 中,系统 RAM 和 VRAM 是一样的)。
  • D3D11_USAGE_IMMUTABLED3D11_USAGE_DEFAULT 基本相同,但你是说你只打算在创建调用中初始化它一次。

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

Games that use content streaming typically have a set of STAGING textures they load data into in the background, and then copy it to DEFAULT textures as they become available for efficient rendering. This lets them reuse both STAGING and DEFAULT textures without the overhead of destroying/creating resources every frame.

请参阅 Microsoft Docs 上这篇有些过时的文章:Resource Management Best Practices