交換鏈結

交換鏈結可控制背景緩衝區旋轉,形成圖形動畫的基礎。

概觀

Direct3D 12 中交換鏈結的程式設計模型與舊版 D3D 中的模型不同。 例如,支援 D3D10 和 D3D11 中存在的自動資源輪替的程式設計便利性已不再支援。 自動資源輪替可讓應用程式轉譯相同的 API 物件,而實際呈現的介面會變更每個畫面。 交換鏈結的行為會隨著 Direct3D 12 而變更,讓 Direct3D 12 的其他功能具有較低的 CPU 額外負荷。 雖然仍支援自動色彩索引鍵和多重取樣,但值得注意的是延展和旋轉。

緩衝區存留期

允許應用程式儲存預先建立的描述元,以參考後端緩衝區:這可藉由確保交換鏈結擁有的緩衝區集永遠不會在交換鏈結的存留期內變更。 IDXGISwapChain::GetBuffer傳回的緩衝區集在呼叫特定 API 之前不會變更:

GetBuffer傳回的緩衝區順序永遠不會變更。

IDXGISwapChain3::GetCurrentBackBufferIndex 會將目前返回緩衝區的索引傳回至應用程式。

交換效果

唯一支援的交換效果是 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD,這需要緩衝區計數大於一個。

在視窗模式與全螢幕模式之間轉換

Direct3D 12 不支援全螢幕獨佔模式, (FSE) 。 相反地,當遊戲是螢幕上唯一可見的應用程式時,OS 會使用稱為全螢幕精靈的策略, (FSO) ,以達到 FSE 的類似效果,而不會有效能缺點。 如需 FSO 的詳細資訊,請參閱 將全螢幕快照解除鎖定

Direct3D 12 會維持應用程式在視窗模式與全螢幕模式之間轉換之後呼叫 ResizeBuffers 的限制, (D3D11 翻轉模型交換鏈結具有相同的限制) 。

IDXGISwapChain::SetFullscreenState轉換不會變更交換鏈結中的應用程式可見緩衝區集。 只有 ResizeBuffersResizeTarget 呼叫會建立或終結應用程式可見緩衝區。 不過,在 Direct3D 12 IDXGISwapChain::SetFullscreenState 中,不會進入全螢幕獨佔模式,而且只會變更解析度和重新整理速率,以允許全螢幕登錄。 這些變更可由應用程式進行,而不需要使用此方法

呼叫 或 IDXGISwapChain::P resentIDXGISwapChain1::P resent 時,要呈現的後端緩衝區必須處於 D3D12_RESOURCE_STATE_PRESENT 狀態。 如果不是這種情況,則存在將會失敗 ,DXGI_ERROR_INVALID_CALL

全螢幕交換鏈結會繼續限制 SetFullscreenState (FALSE,Null) 必須在交換鏈結的最終發行之前呼叫。 SetFullscreenState (FALSE) 在 Direct3D 12 裝置上執行的交換鏈結上成功。

在交換鏈建立時提供的 3D 佇列上發生目前作業,而應用程式可以同時呈現多個交換鏈結,並記錄和執行命令清單。

例如,當圖形的最後部分運作 (時,框架後置處理) 是在計算佇列上完成,或未涉及裝置的圖形佇列,建立要呈現的第二個 3D 佇列可能會很有説明,並防止呈現延遲下一個畫面格的開始。

範例

下列範例程式碼會出現在主要轉譯迴圈中:

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

建立交換鏈結

使用 CreateSwapChainForHwndCreateSwapChainForCoreWindowCreateSwapChainForComposition 呼叫時,請注意 pDevice 參數實際上需要 Direct3D 12 中直接命令佇列的指標,而不是裝置。

在 Windows 7 上呈現

在 Windows 7 上以 Direct3D 12 為目標時,Direct3D 12 的必要 DXGI 類型不存在,因此您必須使用 D3D12On7 提供的 ID3D12CommandQueueDownLevel (從直接命令佇列) 查詢。

您會提供開啟的命令清單給 Windows 7 目前方法,接著會為您使用、關閉並自動提交至裝置。 您必須提供必須建立應用程式的後端緩衝區、必須是認可的資源、必須是單一取樣,而且必須是下列其中一種格式。

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB