共用方式為


選取裝置 (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 裝置