Direct3D 11 中的设备简介

Direct3D 11 对象模型将资源创建和呈现功能分离到设备和一个或多个上下文中;这种分离旨在促进多线程处理。

设备

设备用于创建资源和枚举显示适配器的功能。 在 Direct3D 11 中,设备使用 ID3D11Device 接口表示。

每个应用程序都必须有至少一台设备,大多数应用程序只能创建一台设备。 通过调用 D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain 为计算机上安装的某个硬件驱动程序创建设备,并使用D3D_DRIVER_TYPE标志指定驱动程序类型。 每台设备可以使用一个或多个设备上下文,具体取决于所需的功能。

设备上下文

设备上下文包含使用设备的环境或设置。 更具体地说,设备上下文用于设置管道状态,并使用设备拥有的资源生成呈现命令。 Direct3D 11 实现两种类型的设备上下文,一种用于即时呈现,另一种用于延迟呈现;这两个上下文都用 ID3D11DeviceContext 接口表示。

即时上下文

即时上下文直接呈现给驱动程序。 每台设备都有一个且只有一个即时上下文,可以从 GPU 检索数据。 即时上下文可用于立即呈现 (或) 命令列表播放。

可通过两种方式获取即时上下文:

延迟上下文

延迟上下文将 GPU 命令记录到 命令列表中。 延迟上下文主要用于多线程处理,对于单线程应用程序不是必需的。 延迟上下文通常由工作线程而不是main呈现线程使用。 创建延迟上下文时,它不会从即时上下文继承任何状态。

若要获取延迟的上下文,请调用 ID3D11Device::CreateDeferredContext

任何上下文(即时或延迟)都可以在任何线程上使用,只要上下文一次只在一个线程中使用。

线程处理注意事项

此表突出显示了 Direct3D 11 中的线程模型与早期版本的 Direct3D 的差异。

Direct3D 11 与以前版本的 Direct3D 之间的差异:
所有 ID3D11Device 接口方法都是自由线程方法,这意味着让多个线程同时调用函数是安全的。

  • ID3D11DeviceChild 派生的接口 (ID3D11BufferID3D11Query 等) 都是自由线程接口。
  • Direct3D 11 将资源创建和呈现拆分为两个接口。 Map、Unmap、Begin、End 和 GetData 在 ID3D11DeviceContext 上实现,因为 ID3D11Device 强定义了操作顺序。 ID3D11ResourceID3D11异步 接口也实现自由线程操作的方法。
  • ID3D11DeviceContext 方法 (ID3D11DeviceChild) 上的方法除外,即它们需要单线程处理。 一次只能有一个线程安全地调用其任何方法, (Draw、Copy、Map 等) 。
  • 一般情况下,自由线程处理可最大程度地减少使用的同步基元的数量及其持续时间。 但是,使用长时间保留的同步的应用程序可能会直接影响应用程序可以达到的并发程度。
ID3D10Device 接口方法不是为自由线程的。 ID3D10Device (实现所有创建和呈现功能,就像 Direct3D 9 中的 ID3D9Device 一样。 Map 和 Unmap 在 ID3D10Resource 派生的接口上实现,Begin、End 和 GetData 在 ID3D10Asynchronous 派生接口上实现。

设备