選取裝置 (Direct3D 9)
應用程式可以查詢硬體來偵測支援的 Direct3D 裝置類型。 本節包含列舉顯示介面卡和選取 Direct3D 裝置相關主要工作的相關資訊。
應用程式必須執行一系列工作,才能選取適當的 Direct3D 裝置。 請注意,下列步驟適用于全螢幕應用程式,而且在大部分情況下,視窗化應用程式可以略過大部分的步驟。
一開始,應用程式必須列舉系統上的顯示介面卡。 配接器是實體硬體片段。 請注意,圖形卡可能包含多個單一介面卡,如同雙頭顯示器的情況一樣。 與多監視器支援不相關的應用程式可以忽略此步驟,並將D3DADAPTER_DEFAULT傳遞至步驟 2 中的 IDirect3D9::EnumAdapterModes 方法。
針對每個配接器,應用程式會呼叫 IDirect3D9::EnumAdapterModes來列舉支援的顯示模式。
如有需要,應用程式會呼叫 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;
應用程式會呼叫 IDirect3D9::GetDeviceCaps 方法,檢查此介面卡上裝置所需的功能層級。 此方法傳回的功能保證在所有顯示模式的裝置上都是固定的,由 IDirect3D9::CheckDeviceType驗證。
裝置一律可以轉譯為裝置所支援之列舉顯示模式格式的介面。 如果應用程式需要轉譯成不同格式的介面,它可以呼叫 IDirect3D9::CheckDeviceFormat。 如果裝置可以轉譯為格式,則保證 IDirect3D9::GetDeviceCaps 所傳回的所有功能都適用。
最後,應用程式可以使用 IDirect3D9::CheckDeviceMultiSampleType 方法,判斷是否支援多取樣技術,例如完整場景反鋸齒。
完成上述步驟之後,應用程式應該會有可運作的顯示模式清單。 最後一個步驟是確認有足夠的裝置可存取記憶體,以容納所需的緩衝區數目和反鋸齒。 這項測試是必要的,因為無法預測模式和多重取樣組合的記憶體耗用量,而不需驗證它。 此外,某些顯示器介面卡架構可能沒有固定數量的裝置可存取記憶體。 這表示應用程式應該能夠在進入全螢幕模式時回報視訊記憶體不足失敗。 一般而言,應用程式應該從提供給使用者的模式清單中移除全螢幕模式,或者應該藉由減少後端緩衝區數目或使用較不復雜的多重取樣技術,嘗試取用較少的記憶體。
視窗化應用程式會執行一組類似的工作。
- 它會決定視窗工作區所涵蓋的桌面矩形。
- 它會列舉配接器,尋找其監視器涵蓋工作區的介面卡。 如果工作區是由多個介面卡所擁有,則應用程式可以選擇獨立驅動每個介面卡,或驅動單一介面卡,並在簡報中讓 Direct3D 傳輸圖元從一部裝置到另一個裝置。 應用程式也可以忽略上述兩個步驟,並使用D3DADAPTER_DEFAULT配接器。 請注意,當視窗放在次要監視器上時,這可能會導致作業變慢。
- 應用程式應該呼叫 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;
相關主題