DXGI_SWAP_EFFECT列舉 (dxgi.h)
呼叫 IDXGISwapChain1::P resent1之後,處理顯示介面中像素的選項。
語法
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 使用此旗標來指定位區塊傳輸 (bitblt) 模型,並指定 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 會保存後台緩衝區的內容。 使用此選項,依序呈現交換鏈結的內容,從第一個緩衝區 (buffer 0) 到最後一個緩衝區。 此旗標無法與多重取樣搭配使用。 Direct3D 12:永遠不支援此列舉值。 D3D12 應用程式必須使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD。 |
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,則撰寫器在某些情況下仍可藉由將其他內容繪製到應用程式的背面緩衝區來執行此優化。
當您在翻轉模型交換鏈結DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL上呼叫 IDXGISwapChain1::P resent1,並在 syncInterval 參數中指定 0 時, IDXGISwapChain1::P resent1的行為與 Direct3D 9ExIDirect3DDevice9Ex::P resentEx 與 D3DSWAPEFFECT_FLIPEX 和 D3DPRESENT_FORCEIMMEDIATE的行為相同。 也就是說,運行時間不只會顯示下一個框架,而不是任何先前排入佇列的框架,也會終止先前佇列框架上剩餘的時間。
無論翻轉模型是否更有效率,應用程式仍可能會選擇 bitblt 模型,因為 bitblt 模型是混合 GDI 和 DirectX 簡報的唯一方法。 在翻轉模型中,應用程式必須使用 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE建立交換鏈結,然後必須明確地在後端緩衝區上使用 GetDC。 在翻轉模型交換鏈結上第一次成功呼叫 IDXGISwapChain1::P resent 1 之後,GDI 不再與與該交換鏈結相關聯的 HWND 搭配運作,即使在交換鏈結損毀之後也一樣。 此限制甚至延伸到 ScrollWindowEx等方法。
若要顯示 HDR 交換鏈緩衝區格式和色彩空間,則需要翻轉模型。 否則,他們會在 SDR 撰寫(並裁剪),其範圍為 0-1。
如需翻轉模型交換鏈結和優化簡報的詳細資訊,請參閱 使用翻轉模型、髒矩形和卷動區域增強簡報。
例子
若要在 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 |