Выбор устройства (Direct3D 9)

Приложения могут запрашивать оборудование для обнаружения поддерживаемых типов устройств Direct3D. В этом разделе содержатся сведения об основных задачах, связанных с перечислением видеоадаптеров и выбором устройств Direct3D.

Приложение должно выполнить ряд задач, чтобы выбрать соответствующее устройство Direct3D. Обратите внимание, что следующие шаги предназначены для полноэкранного приложения и что в большинстве случаев оконное приложение может пропустить большинство из этих действий.

  1. Изначально приложение должно перечислить видеоадаптеры в системе. Адаптер — это физическая часть оборудования. Обратите внимание, что графические карта могут содержать более одного адаптера, как в случае с двумя головными дисплеями. Приложения, не связанные с поддержкой нескольких мониторов, могут игнорировать этот шаг и передавать D3DADAPTER_DEFAULT методу IDirect3D9::EnumAdapterModes на шаге 2.

  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