D3D11_USAGE枚举 (d3d11.h)

标识呈现期间的预期资源使用。 使用情况直接反映 CPU 和/或图形处理单元 (GPU) 访问资源。

语法

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

常量

 
D3D11_USAGE_DEFAULT
值: 0
需要 GPU 读取和写入访问权限的资源。 这可能是最常见的使用选择。
D3D11_USAGE_IMMUTABLE
值:1
只能由 GPU 读取的资源。 它不能由 GPU 编写,并且不能由 CPU 访问。 创建资源时必须初始化这种类型的资源,因为创建后无法更改该资源。
D3D11_USAGE_DYNAMIC
值: 2
GPU (只读) 访问的资源,CPU (只写入) 。 对于每个帧至少由 CPU 更新一次的资源,动态资源是一个不错的选择。 若要更新动态资源,请使用 Map 方法。

有关如何使用动态资源的信息,请参阅 如何:使用动态资源
D3D11_USAGE_STAGING
值: 3
支持将数据传输的资源 (从 GPU 复制到 CPU) 。

注解

应用程序标识资源在资源说明中 (其使用情况) 使用的方式。 创建资源有几种结构,包括: D3D11_TEXTURE1D_DESCD3D11_TEXTURE2D_DESCD3D11_TEXTURE3D_DESCD3D11_BUFFER_DESC

Direct3D 9 和 Direct3D 10/11 之间的差异:

在 Direct3D 9 中,可以使用 D3DPOOL () 在资源创建时指定资源创建时应在其中创建的内存类型。 这是一个应用程序的工作,用于确定哪些内存池将提供最佳功能和性能组合。

在 Direct3D 10/11 中,应用程序不再指定要在其中创建资源的池) (内存类型。 相反,请指定资源的预期使用情况,让运行时与驱动程序和内存管理器 () 选择可实现最佳性能的内存类型。

 

资源使用限制

每个用法都决定了 CPU 的辅助功能与 GPU 的辅助功能之间的权衡。 通常,这两个处理器之一的高性能访问意味着另一个处理器的性能较低。 无论哪种极端情况都是 D3D11_USAGE_DEFAULTD3D11_USAGE_STAGING 用法。 D3D11_USAGE_DEFAULT 几乎完全限制对 GPU 的访问。 D3D11_USAGE_STAGING 几乎完全限制对 CPU 的访问,并且只允许在 GPU 与 CPU 之间复制资源) (数据传输。 可以通过 ID3D11DeviceContext::CopySubresourceRegionID3D11DeviceContext::CopyResource 方法执行这些复制操作。 还可以使用这些复制方法在同一用法的两个资源之间复制数据。 还可以使用 ID3D11DeviceContext::UpdateSubresource 方法直接从 CPU 提供的指针将内存复制到任何资源,最有用的是具有 D3D11_USAGE_DEFAULT的资源。

D3D11_USAGE_DYNAMIC 使用情况是一种特殊情况,当 CPU 生成数据并发送频率较高的数据时,它会优化从 CPU 到 GPU 的数据流。 D3D11_USAGE_DYNAMIC 通常用于具有顶点数据和常量缓冲区的资源。 使用 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap 方法将数据写入这些资源。 若要实现串行使用的数据(如顶点数据)的最高性能,请使用 D3D11_MAP_WRITE_NO_OVERWRITED3D11_MAP_WRITE_DISCARD 序列。 有关此序列的详细信息,请参阅 D3D11_MAP_WRITE_NO_OVERWRITE D3D11_MAP_WRITE_DISCARD的常见用法

D3D11_USAGE_IMMUTABLE 用法是另一种特殊情况,导致 GPU 在创建资源时仅生成一次数据。 D3D11_USAGE_IMMUTABLE 非常适合纹理等数据,因为此类数据通常从某些文件格式读入内存中。 因此,使用 D3D11_USAGE_IMMUTABLE 创建纹理时,GPU 会将该纹理直接读取到内存中。

使用下表选择最能描述 CPU 和/或 GPU 需要如何访问资源的使用情况。 当然,会有性能权衡。

资源使用情况 默认 动态 不可变 过渡
GPU-Read 是的
GPU-Write 是的
CPU-Read 是的
CPU-Write 是的
 

1 - 使用 D3D11_USAGE_STAGING 的资源的 GPU 读取或写入仅限于复制操作。 使用这些复制操作的 ID3D11DeviceContext::CopySubresourceRegionID3D11DeviceContext::CopyResource 。 此外,由于深度模具格式和多重采样布局是特定 GPU 设计的实现详细信息,因此操作系统通常不能将这些格式和布局公开给 CPU。 因此,暂存资源不能是深度模具缓冲区或多采样呈现目标。

注意 在技术上,可以使用 ID3D11DeviceContext::UpdateSubresource 复制到除 D3D11_USAGE_IMMUTABLE以外的任何使用情况的资源。 但是,我们建议使用 ID3D11DeviceContext::UpdateSubresource 仅更新 具有D3D11_USAGE_DEFAULT的资源。 建议使用 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap 使用 D3D11_USAGE_DYNAMIC 更新资源,因为这是 D3D11_USAGE_DYNAMIC 资源的特定用途,因此是最优化的路径。
 
请注意D3D11_USAGE_DYNAMIC 资源使用特定的硬件功能。 因此,请谨慎使用它们。 显示驱动程序通常使用缓存算法为 D3D11_USAGE_DYNAMIC 资源分配内存,该算法有利于 CPU 写入并阻碍 CPU 读取。 此外,对于对 ID3D11DeviceContext::Map 的连续调用,D3D11_USAGE_DYNAMIC资源背后的内存可能不相同。 因此,不要期望从 D3D11_USAGE_DYNAMIC 资源读取高性能甚至一致的 CPU 读取。
 
注意ID3D11DeviceContext::CopyStructureCount 是 GPU 到 CPU 复制的特殊情况。 仅将 ID3D11DeviceContext::CopyStructureCount 与未排序的访问视图一起使用, (UAV) 缓冲区。
 

资源绑定选项

为了最大限度地提高性能,并非所有资源使用选项都可以用作管道的输入或输出资源。 此表标识这些限制。
资源可以绑定为 默认 动态 不可变 过渡
阶段的输入 是的 是的,是
阶段的输出 是的
 
  • 2 - 如果使用不同视图作为输入和输出绑定,则每个视图必须使用不同的子资源。
  • 3 - 只能使用单个子资源创建资源。 资源不能是纹理数组。 资源不能是 mipmap 链。

要求

   
标头 d3d11.h

另请参阅

资源枚举