多头 (Direct3D 9)

多头卡是具有通用帧缓冲区和加速器、独立的数模转换器 (DAC) 和监视输出的卡。 与类似数量的异类显示适配器相比,此类设备可以提供更易用的多显示器支持。

多头卡在 API 中作为单个 API 级别设备公开,可驱动多个全屏交换链。 因此,所有资源都与所有头共享,并且每个头具有完全相同的功能。 每个头都可以设置为独立的显示模式。 可以使用对 IDirect3DSwapChain9::P resent 的单独调用来刷新每个头。 还可以使用对 IDirect3DDevice9::P resent 的一次调用来按顺序刷新每个头。

注意

每次调用 IDirect3DDevice9::P resent 时,不会同时进行每个头的刷新。 Direct3D 9Ex 中的显示统计信息可以使用 D3DPRESENTSTATS 结构使每个头的刷新彼此靠近,以限制跨多个适配器头的撕裂效果。 有关同步 Direct3D 9Ex 翻转模型应用程序的帧的信息,请参阅 Direct3D 9Ex 改进

 

多头设备的每个交换链都必须全屏显示。 当设备进入多头模式时,它必须保持全屏。 转换回窗口模式需要销毁设备 (除了正常的 Alt+TAB-to-minimize 操作) 。

在头之间划分视频内存并将每个头视为完全独立的加速器的旧方法仍然是一种常见的使用方案。 除非应用程序经过专门编码以在 Direct3D 9 多头模式下运行,否则此建议不会替换该机制。

驱动程序有足够的知识在两种操作模式之间切换。

一个头称为主头,同一卡上所有其他头称为从属头。 如果系统中存在多个多头适配器,则来自一个多头适配器的主适配器及其从属适配器称为组。 组由其主头的适配器序号表示。

D3DCAPS9 结构已更新为公开以下新的硬件上限。

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • 对于传统适配器,NumberOfAdaptersInGroup 为 1,对于多头卡的主适配器,则大于 1。 对于多头卡的从属适配器,该值将为 0。 每个卡最多可以有一个主数据库,但可能有多个从属。
  • MasterAdapterOrdinal 指示哪个设备是此从属设备的主设备。
  • AdapterOrdinalInGroup 指示 API 引用头的顺序。 主适配器始终具有 AdapterOrdinalInGroup 0。 这些值不对应于传递给 IDirect3D9 方法的适配器序号,但仅适用于组中的头。

此定义允许多头卡继续显示多个适配器,就像它们是独立卡一样,就像在 DirectX 8 中一样。

若要创建多头设备,请在 IDirect3D9::CreateDevice 中指定行为标志D3DCREATE_ADAPTERGROUP_DEVICE。 表示参数 (D3DPRESENT_PARAMETERS 数组) 应包含 NumberOfAdaptersInGroup 元素。 运行时将按 AdapterOrdinalInGroup 数字顺序将每个元素分配给每个头。 设置D3DCREATE_ADAPTERGROUP_DEVICE时,每个演示文稿参数必须具有:

  • 设置为 FALSE 的 Windowed 成员 (换而言之,是全屏) 。
  • D3DPRESENT_PARAMETERS 的 EnableAutoDepthStencil 成员的相同值。

此外,如果 EnableAutoDepthStencil 为 TRUE,则每个 D3DPRESENT_PARAMETERS的以下每个字段都必须具有相同的值:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

如果设置了 DAC,则对 IDirect3DDevice9::CreateAdditionalSwapChain 的其他调用是非法的。

如果设备是使用 DAC 创建的, 则 IDirect3DDevice9::Reset 需要 D3DPRESENT_PARAMETERS数组。

传递给 IDirect3DDevice9::Reset 的每个D3DPRESENT_PARAMETERS结构都必须全屏显示。 若要切换回窗口模式,应用程序必须销毁设备,并在窗口模式下重新创建非多头设备。

下面是一个基本使用方案:

1. Create multihead device 
2. For each swap chain of device:
   3. Call GetBackBuffer for the i-th swapchain
   4. Call SetRenderTarget 
   5. Call DrawPrimitive 
   6. Optionally call swapchain::Present (or wait until 
all swap chains are drawn and present outside of loop)
7. End the for loop
8. Optionally present all swap chains with device::Present

有关详细信息,请参阅 IDirect3D9::CreateDeviceIDirect3DDevice9::GetNumberOfSwapChains

编程提示