Direct3D 11 中的多线程处理简介

多线程处理旨在通过同时使用一个或多个线程执行工作来提高性能。

过去,这通常是通过生成单个main线程进行呈现和一个或多个线程来完成的,以便执行对象创建、加载、处理等准备工作。 但是,使用 Direct3D 11 中的内置同步,多线程背后的目标是利用每个 CPU 和 GPU 周期,而不让处理器等待另一个处理器 (尤其不会让 GPU 等待,因为它直接影响帧速率) 。 通过这样做,可以生成最多的工作量,同时保持最佳帧速率。 由于 API 实现同步,因此不再需要使用单个帧进行呈现的概念。

多线程处理需要某种形式的同步。 例如,如果应用程序中运行的多个线程必须访问单个设备上下文 (ID3D11DeviceContext) ,则该应用程序必须使用某些同步机制(例如关键部分)来同步对该设备上下文的访问。 这是因为呈现命令的处理 (通常在 GPU) 上完成,生成呈现命令 (通常在 CPU 上通过对象创建、数据加载、状态更改、数据处理) 通常使用相同的资源 (纹理、着色器、管道状态等) 。 跨多个线程组织工作需要同步,以防止一个线程修改或读取另一个线程正在修改的数据。

虽然使用设备上下文 (ID3D11DeviceContext) 不是线程安全的,但使用 Direct3D 11 设备 (ID3D11Device) 是线程安全的。 由于每个 ID3D11DeviceContext 都是单线程的,因此一次只能有一个线程调用 ID3D11DeviceContext 。 如果多个线程必须访问单个 ID3D11DeviceContext,则必须使用某些同步机制(例如关键部分)来同步对该 ID3D11DeviceContext 的访问。 但是,使用关键部分或同步基元访问单个 ID3D11Device 不需要多个线程。 因此,如果应用程序使用 ID3D11Device 创建资源对象,则该应用程序不需要使用同步同时创建多个资源对象。

多线程支持将 API 划分为两个不同的功能区域:

多线程性能取决于驱动程序支持。 如何:检查驱动程序支持 提供了有关查询驱动程序以及结果含义的详细信息。

Direct3D 11 从头开始设计,支持多线程处理。 Direct3D 10 使用 线程安全层实现对多线程的有限支持。 本页列出了两个 DirectX 版本之间的行为差异: Direct3D 版本之间的线程差异

多线程处理和 DXGI

一次只能有一个线程使用即时上下文。 但是,应用程序还应将同一线程用于 Microsoft DirectX 图形基础结构 (DXGI) 操作,尤其是在应用程序调用 IDXGISwapChain::P resent 方法时。

注意

与大多数 DXGI 接口函数同时使用即时上下文无效。 对于 2009 年 3 月及更高版本的 DirectX SDK,唯一安全的 DXGI 函数是 AddRefReleaseQueryInterface

 

有关将 DXGI 用于多个线程的详细信息,请参阅 多线程注意事项

多线程处理