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 需要如何访问资源的使用情况。 当然,会有性能权衡。

资源使用情况 Default 动态 不可变 过渡
GPU-Read yes¹
GPU-Write yes¹
CPU-Read yes¹
CPU-Write yes¹
 

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 资源使用特定的硬件功能。 因此,请谨慎使用它们。 显示驱动程序通常使用有利于 CPU 写入和阻碍 CPU 读取的缓存算法为 D3D11_USAGE_DYNAMIC 资源分配内存。 此外,对于对 ID3D11DeviceContext::Map 的连续调用,D3D11_USAGE_DYNAMIC资源背后的内存甚至可能不相同。 因此,不要期望从 D3D11_USAGE_DYNAMIC 资源进行高性能甚至一致的 CPU 读取。
 
注意ID3D11DeviceContext::CopyStructureCount 是 GPU 到 CPU 复制的一种特殊情况。 仅对无序访问视图使用 ID3D11DeviceContext::CopyStructureCount , (UAV) 缓冲区。
 

资源绑定选项

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

要求

要求
Header d3d11.h

另请参阅

资源枚举