选择设备 (Direct3D 9)

应用程序可以查询硬件以检测支持的 Direct3D 设备类型。 本部分包含有关枚举显示适配器和选择 Direct3D 设备所涉及的主要任务的信息。

应用程序必须执行一系列任务才能选择适当的 Direct3D 设备。 请注意,以下步骤适用于全屏应用程序,在大多数情况下,窗口化应用程序可以跳过其中大部分步骤。

  1. 最初,应用程序必须枚举系统上的显示适配器。 适配器是物理硬件。 请注意,图形卡可能包含多个适配器,就像双头显示器一样。 与多监视器支持无关的应用程序可以忽略此步骤,并将D3DADAPTER_DEFAULT传递到步骤 2 中的 IDirect3D9::EnumAdapterModes 方法。

  2. 对于每个适配器,应用程序通过调用 IDirect3D9::EnumAdapterModes 枚举支持的显示模式。

  3. 如果需要,应用程序通过调用 IDirect3D9::CheckDeviceType 来检查每个枚举显示模式下是否存在硬件加速,如以下代码示例所示。 请注意,这只是 IDirect3D9::CheckDeviceType 的可能用途之一;有关详细信息,请参阅 确定 Direct3D 9) (硬件支持

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. 应用程序通过调用 IDirect3D9::GetDeviceCaps 方法检查此适配器上的设备所需的功能级别。 此方法返回的功能保证在所有显示模式下的设备都是恒定的,由 IDirect3D9::CheckDeviceType 验证

  5. 设备始终可以呈现到设备支持的枚举显示模式格式的图面。 如果应用程序需要呈现到不同格式的图面,它可以调用 IDirect3D9::CheckDeviceFormat。 如果设备可以呈现为格式,则保证 IDirect3D9::GetDeviceCaps 返回的所有功能都适用。

  6. 最后,应用程序可以使用 IDirect3D9::CheckDeviceMultiSampleType 方法确定呈现格式是否支持多重采样技术(如全场景抗锯齿)。

完成上述步骤后,应用程序应具有可运行的显示模式列表。 最后一步是验证是否有足够的设备可访问内存来容纳所需数量的缓冲区和抗锯齿。 此测试是必需的,因为如果不进行验证,就无法预测模式和多采样组合的内存消耗。 此外,某些显示适配器体系结构可能没有恒定的设备可访问内存量。 这意味着应用程序应该能够在进入全屏模式时报告内存不足的故障。 通常,应用程序应从提供给用户的模式列表中删除全屏模式,或者它应尝试通过减少后台缓冲区的数量或使用不太复杂的多重采样技术来消耗更少的内存。

窗口化应用程序执行一组类似的任务。

  1. 它确定窗口工作区所覆盖的桌面矩形。
  2. 它枚举适配器,查找其监视器覆盖工作区的适配器。 如果工作区由多个适配器拥有,则应用程序可以选择独立驱动每个适配器,或驱动单个适配器,并在演示时使用 Direct3D 传输像素从一台设备到另一台设备。 应用程序还可以忽略前面的两个步骤,并使用 D3DADAPTER_DEFAULT 适配器。 请注意,当窗口放置在辅助监视器上时,这可能会导致操作速度变慢。
  3. 应用程序应调用 IDirect3D9::CheckDeviceType ,以确定设备在桌面模式下是否可以支持呈现到指定格式的后台缓冲区。 IDirect3D9::GetAdapterDisplayMode 可用于确定桌面显示格式,如以下代码示例所示。
    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;
    

Direct3D 设备