共用方式為


多頭 (Direct3D 9)

多頭卡是具有通用框架緩衝區和加速器、獨立數位對模擬轉換器(DAC)和監視輸出的卡片。 這類裝置可以提供比類似數目的異質顯示器配接器更多的可用多個監視器支援。

多頭卡片會在 API 中公開為單一 API 層級裝置,可驅動數個全螢幕交換鏈結。 因此,所有資源都會與所有前端共用,且每個前端都有完全相同的功能。 每個前端都可以設定為獨立的顯示模式。 您可以使用個別呼叫來 IDirect3DSwapChain9::P resent 來重新整理每個前端。 您也可以使用一個呼叫來 IDirect3DDevice9::P resent 來循序重新整理每個前端。

注意

每個前端的重新整理不會同時對 IDirect3DDevice9::P resent進行單一呼叫。 Direct3D 9Ex 中的目前統計數據可以使用 D3DPRESENTSTATS 結構,讓每個頭部保持彼此接近的重新整理,以限制多個配接器頭部的撕裂效果。 如需同步處理 Direct3D 9Ex 翻轉模型應用程式框架的詳細資訊,請參閱 Direct3D 9Ex 改善

 

多頭裝置的每個交換鏈結都必須是全螢幕。 當裝置進入多標題模式時,它必須保持全螢幕。 轉換回視窗模式需要解構裝置(除了正常 ALT+TAB 到最小化作業除外)。

將視訊記憶體分割在頭部和將每個頭部視為完全獨立的加速器的舊方法仍然是常見的使用案例。 除非應用程式已特別編碼為在 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時,每個簡報參數都必須具有:

  • Windowed 成員設定為 FALSE (換句話說,為全螢幕)。
  • 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

程式設計秘訣