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_DESC、 D3D11_TEXTURE2D_DESC、 D3D11_TEXTURE3D_DESC和 D3D11_BUFFER_DESC。
Direct3D 9 和 Direct3D 10/11 之间的差异: 在 Direct3D 9 中,可以使用 D3DPOOL () 在资源创建时指定资源创建时应在其中创建的内存类型。 这是一个应用程序的工作,用于确定哪些内存池将提供最佳功能和性能组合。 在 Direct3D 10/11 中,应用程序不再指定要在其中创建资源的池) (内存类型。 相反,请指定资源的预期使用情况,让运行时与驱动程序和内存管理器 () 选择可实现最佳性能的内存类型。 |
资源使用限制
每个用法都决定了 CPU 的辅助功能与 GPU 的辅助功能之间的权衡。 通常,这两个处理器之一的高性能访问意味着另一个处理器的性能较低。 无论哪种极端情况都是 D3D11_USAGE_DEFAULT 和 D3D11_USAGE_STAGING 用法。 D3D11_USAGE_DEFAULT 几乎完全限制对 GPU 的访问。 D3D11_USAGE_STAGING 几乎完全限制对 CPU 的访问,并且只允许在 GPU 与 CPU 之间复制资源) (数据传输。 可以通过 ID3D11DeviceContext::CopySubresourceRegion 和 ID3D11DeviceContext::CopyResource 方法执行这些复制操作。 还可以使用这些复制方法在同一用法的两个资源之间复制数据。 还可以使用 ID3D11DeviceContext::UpdateSubresource 方法直接从 CPU 提供的指针将内存复制到任何资源,最有用的是具有 D3D11_USAGE_DEFAULT的资源。D3D11_USAGE_DYNAMIC 使用情况是一种特殊情况,当 CPU 生成数据并发送频率较高的数据时,它会优化从 CPU 到 GPU 的数据流。 D3D11_USAGE_DYNAMIC 通常用于具有顶点数据和常量缓冲区的资源。 使用 ID3D11DeviceContext::Map 和 ID3D11DeviceContext::Unmap 方法将数据写入这些资源。 若要实现串行使用的数据(如顶点数据)的最高性能,请使用 D3D11_MAP_WRITE_NO_OVERWRITE 和 D3D11_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::CopySubresourceRegion 和 ID3D11DeviceContext::CopyResource 。 此外,由于深度模具格式和多重采样布局是特定 GPU 设计的实现详细信息,因此操作系统通常不能将这些格式和布局公开给 CPU。 因此,暂存资源不能是深度模具缓冲区或多采样呈现目标。
资源绑定选项
为了最大限度地提高性能,并非所有资源使用选项都可以用作管道的输入或输出资源。 此表标识这些限制。资源可以绑定为 | 默认 | 动态 | 不可变 | 过渡 |
---|---|---|---|---|
阶段的输入 | 是的 | 是的,是 | 是 | |
阶段的输出 | 是的 |
- 2 - 如果使用不同视图作为输入和输出绑定,则每个视图必须使用不同的子资源。
- 3 - 只能使用单个子资源创建资源。 资源不能是纹理数组。 资源不能是 mipmap 链。
要求
标头 | d3d11.h |