DXGI_SWAP_EFFECT列舉 (dxgi.h)
呼叫 IDXGISwapChain1::P resent1 之後,處理顯示介面中像素的選項。
Syntax
typedef enum DXGI_SWAP_EFFECT {
DXGI_SWAP_EFFECT_DISCARD = 0,
DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;
常數
DXGI_SWAP_EFFECT_DISCARD 值: 0 使用此旗標來指定 bit-block transfer (bitblt) model,並指定 DXGI 在呼叫 IDXGISwapChain1::P resent1 之後捨棄後端緩衝區的內容。 此旗標適用於具有多個後台緩衝區的交換鏈結,雖然應用程式只有緩衝區0的讀取和寫入許可權。 使用此旗標可讓顯示驅動程式選取交換鏈結最有效率的呈現技術。 Direct3D 12: 永遠不支持這個列舉值。 D3D12 應用程式必須使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD。
注意 全螢幕獨佔和全螢幕 UWP 之間有差異。 如果您要將 Direct3D 11 應用程式移植到 Windows 電腦上的 UWP,請注意在建立交換鏈結時使用DXGI_SWAP_EFFECT_DISCARD 在UWP中的行為與 Win32 相同,而且其使用可能會對 GPU 效能造成負面影響。 這是因為 UWP 應用程式會強制進入 FLIP 交換模式, (即使其他交換模式已設定) ,因為這可減少計算 記憶體復本原本由舊版 bitblt 模型所使用的時間。 建議的方法是手動轉換 DX11 捨棄交換鏈結,以在 UWP 中使用翻轉模型,並盡可能使用 DXGI_SWAP_EFFECT_FLIP_DISCARD 而非 DXGI_SWAP_EFFECT_DISCARD 。 請參閱下列範例,並參閱 這篇文章 以取得詳細資訊。 |
DXGI_SWAP_EFFECT_SEQUENTIAL 值: 1 使用此旗標來指定 bitblt 模型,並指定當您呼叫 IDXGISwapChain1::P resent1 之後,DXGI 會保存後台緩衝區的內容。 使用此選項可依序呈現交換鏈結的內容,從第一個緩衝區 (緩衝區 0) 到最後一個緩衝區。 此旗標無法與多重取樣搭配使用。 Direct3D 12: 永遠不支持這個列舉值。 D3D12 應用程式必須使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD。
注意 為了獲得最佳效能,請使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ,而不是 DXGI_SWAP_EFFECT_SEQUENTIAL。 如需詳細資訊,請參閱本文。 |
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 值: 3 使用此旗標來指定翻轉簡報模型,並指定當您呼叫 IDXGISwapChain1::P resent1 之後,DXGI 會保存後台緩衝區的內容。 此旗標無法與多重取樣搭配使用。 Direct3D 11: 從 Windows 8 開始,支援這個列舉值。 |
DXGI_SWAP_EFFECT_FLIP_DISCARD 值: 4 使用此旗標來指定翻轉簡報模型,並在呼叫 IDXGISwapChain1::P resent1 之後,指定 DXGI 捨棄後台緩衝區的內容。 此旗標無法與多重取樣和部分簡報搭配使用。 請參閱 DXGI 1.4 改善。 Direct3D 11: 從 Windows 10 開始,支援這個列舉值。 此旗標適用於具有多個後台緩衝區的交換鏈結;雖然應用程式只有緩衝區 0 的讀取和寫入存取權。
注意 Windows 市集應用程式必須使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD。 |
備註
此列舉是由 DXGI_SWAP_CHAIN_DESC 和 DXGI_SWAP_CHAIN_DESC1 結構使用。
在 D3D12 中,僅支援 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 和 DXGI_SWAP_EFFECT_FLIP_DISCARD ,而且不支援 bitblt 模型。 因此,D3D12 不支援多重取樣後台緩衝區,而且您必須使用 ID3D12GraphicsCommandList::ResolveSubresource 或 ID3D12GraphicsCommandList1::ResolveSubresourceRegion 在應用程式中手動執行多重取樣。
若要搭配 DXGI_SWAP_EFFECT_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL使用多重取樣,您必須在不同的轉譯目標中執行多重取樣。 例如,藉由呼叫 ID3D11Device::CreateTexture2D 來建立多重取樣紋理,其中包含已填滿 的D3D11_TEXTURE2D_DESC結構, (BindFlags 成員設定為 D3D11_BIND_RENDER_TARGET ,而 SampleDesc 成員具有多重取樣參數) 。 接下來,呼叫 ID3D11Device::CreateRenderTargetView 來建立紋理的轉譯目標檢視,並將場景轉譯成紋理。 最後,呼叫 ID3D11DeviceContext::ResolveSubresource ,將多重取樣紋理解析成非多重取樣交換鏈結。
簡報模型之間的主要差異在於後端緩衝區內容如何取得桌面視窗管理員 (DWM) 進行組合。 在 bitblt 模型中,與 DXGI_SWAP_EFFECT_DISCARD 和 DXGI_SWAP_EFFECT_SEQUENTIAL 值搭配使用,後端緩衝區的內容會在每次呼叫 IDXGISwapChain1::P resent1 時複製到重新導向介面中。 在與 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 值搭配使用的翻轉模型中,所有後台緩衝區都會與 DWM 共用。 因此,DWM 可以直接從這些後台緩衝區撰寫,而不需要執行任何其他複製作業。 一般而言,翻轉模型是更有效率的模型。 翻轉模型也提供更多功能,例如增強的目前統計數據。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL和DXGI_SWAP_EFFECT_FLIP_DISCARD之間的差異在於,DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL會強制 DXGI 確保每個後端緩衝區的內容會跨IDXGISwapChain::Present
呼叫保留,而DXGI_SWAP_EFFECT_FLIP_DISCARD不提供這項保證。 在特定案例下,撰寫器可以使用 DirectFlip,其中它會使用應用程式的後台緩衝區作為整個顯示後台緩衝區,這會將應用程式背面緩衝區複製到最終桌面後台緩衝區的成本。 使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 和 DXGI_SWAP_EFFECT_FLIP_DISCARD,當應用程式是畫面上唯一可見的專案時,就會發生此優化。 不過,即使應用程式不是螢幕上唯一可見的專案,如果翻轉模型 是DXGI_SWAP_EFFECT_FLIP_DISCARD,則撰寫器在某些情況下仍可藉由將其他內容繪製到應用程式的後台緩衝區來執行此優化。
當您在翻轉模型交換鏈結上呼叫 IDXGISwapChain1::P resent1 時, (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) SyncInterval 參數中指定的 0,IDXGISwapChain1 ::P resent1 的行為與 Direct3D 9Ex 的 IDirect3DDDevice9Ex::P resentEx 與 D3DSWAPEFFECT_FLIPEX 和 D3DPRESENT_FORCEIMMEDIATE 的行為相同。 也就是說,運行時間不只會顯示下一個畫面格,而不是任何先前佇列的框架,也會終止先前佇列框架上剩餘的任何時間。
不論翻轉模型是否更有效率,應用程式仍可能會選擇 bitblt 模型,因為 bitblt 模型是混合 GDI 和 DirectX 簡報的唯一方式。 在翻轉模型中,應用程式必須建立具有DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE的交換鏈 結,然後必須明確地在後端緩衝區上使用 GetDC 。 在翻轉模型交換鏈結上第一次成功呼叫 IDXGISwapChain1::P resent1 之後,GDI不再與該交換鏈結相關聯的 HWND 運作,即使在交換鏈結損毀之後也一樣。 此限制甚至延伸到 ScrollWindowEx 之類的方法。
如需翻轉模型交換鏈結和優化簡報的詳細資訊,請參閱 使用翻轉模型、中途矩形和卷動區域增強簡報。
範例
若要在UWP中建立交換鏈結,您只需要建立 DX11 範本的新實例,並查看 D3D12 範例中的 實DeviceResources::CreateWindowSizeDependentResources
作。
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width); // Match the size of the window.
swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency.
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // All Windows Store apps must use a flip effect.
swapChainDesc.Flags = 2048;
swapChainDesc.Scaling = scaling;
swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
// This sequence obtains the DXGI factory that was used to create the Direct3D device above.
ComPtr<IDXGIDevice3> dxgiDevice;
DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));
ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));
ComPtr<IDXGIFactory4> dxgiFactory;
DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));
ComPtr<IDXGISwapChain1> swapChain;
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForCoreWindow(
m_d3dDevice.Get(),
reinterpret_cast<IUnknown*>(m_window.Get()),
&swapChainDesc,
nullptr,
&swapChain
)
);
規格需求
需求 | 值 |
---|---|
標頭 | dxgi.h |