enumerazione DXGI_SWAP_EFFECT (dxgi.h)
Opzioni per la gestione dei pixel in una superficie di visualizzazione dopo aver chiamato IDXGISwapChain1::P resent1.
Sintassi
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
} ;
Costanti
DXGI_SWAP_EFFECT_DISCARD Valore: 0 Usare questo flag per specificare il modello bit-block transfer (bitblt) e per specificare che DXGI rimuove il contenuto del buffer nascosto dopo aver chiamato IDXGISwapChain1::P resent1. Questo flag è valido per una catena di scambio con più buffer nascosto, anche se le applicazioni dispongono solo dell'accesso in lettura e scrittura al buffer 0. Usare questo flag per consentire al driver di visualizzazione di selezionare la tecnica di presentazione più efficiente per la catena di scambio. Direct3D 12: Questo valore di enumerazione non è mai supportato. Le app D3D12 devono usare DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD.
Nota Esistono differenze tra la piattaforma UWP esclusiva a schermo intero e la piattaforma UWP a schermo intero. Se stai convertendo un'applicazione Direct3D 11 in UWP in un PC Windows, tieni presente che l'uso di DXGI_SWAP_EFFECT_DISCARD durante la creazione di catene di scambio non si comporta come in UWP come in Win32 e il suo uso potrebbe essere dannoso per le prestazioni della GPU. Ciò è dovuto al fatto che le applicazioni UWP sono forzate in modalità di scambio FLIP (anche se sono impostate altre modalità di scambio), perché ciò riduce il calcolo tempo usato dalle copie di memoria originariamente eseguite dal modello bitblt precedente. L'approccio consigliato consiste nel convertire manualmente catene di scambio DX11 Discard per usare i modelli flip all'interno della piattaforma UWP, usando DXGI_SWAP_EFFECT_FLIP_DISCARD anziché DXGI_SWAP_EFFECT_DISCARD laddove possibile. Per altre informazioni, vedere l'esempio seguente e vedere questo articolo. |
DXGI_SWAP_EFFECT_SEQUENTIAL Valore: 1 Usare questo flag per specificare il modello bitblt e specificare che DXGI mantiene il contenuto del buffer nascosto dopo aver chiamato IDXGISwapChain1::P resent1. Utilizzare questa opzione per presentare il contenuto della catena di scambio in ordine, dal primo buffer (buffer 0) all'ultimo buffer. Questo flag non può essere usato con multicampionamento. Direct3D 12: Questo valore di enumerazione non è mai supportato. Le app D3D12 devono usare DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD.
Nota Per ottenere prestazioni ottimali, usare DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL anziché DXGI_SWAP_EFFECT_SEQUENTIAL. Per altre informazioni, vedere questo articolo. |
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Valore: 3 Usare questo flag per specificare il modello di presentazione flip e specificare che DXGI mantiene il contenuto del buffer nascosto dopo aver chiamato IDXGISwapChain1::P resent1. Questo flag non può essere usato con multicampionamento. Direct3D 11: Questo valore di enumerazione è supportato a partire da Windows 8. |
DXGI_SWAP_EFFECT_FLIP_DISCARD Valore: 4 Usare questo flag per specificare il modello di presentazione flip e per specificare che DXGI rimuove il contenuto del buffer nascosto dopo aver chiamato IDXGISwapChain1::P resent1. Questo flag non può essere utilizzato con multicampionamento e presentazione parziale. Vedere DXGI 1.4 Improvements. Direct3D 11: Questo valore di enumerazione è supportato a partire da Windows 10. Questo flag è valido per una catena di scambio con più buffer nascosto; anche se le applicazioni hanno accesso in lettura e scrittura solo al buffer 0.
Nota le app di Windows Store devono usare DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD. |
Osservazioni
Questa enumerazione viene utilizzata dalle strutture DXGI_SWAP_CHAIN_DESC e DXGI_SWAP_CHAIN_DESC1.
In D3D12 sono supportati solo DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD e i modelli bitblt. Per questo motivo, il multicampionamento di un buffer nascosto non è supportato in D3D12 ed è necessario eseguire manualmente il multicampionamento nell'app usando ID3D12GraphicsCommandList::ResolveSubresource o ID3D12GraphicsCommandList1::ResolveSubresourceRegion.
Per usare il multicampionamento con DXGI_SWAP_EFFECT_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, è necessario eseguire il multicampionamento in una destinazione di rendering separata. Ad esempio, creare una trama multicampionato chiamando ID3D11Device::CreateTexture2D con una struttura D3D11_TEXTURE2D_DESC riempita (membro BindFlags impostato su D3D11_BIND_RENDER_TARGET e membro SampleDesc con parametri multicampionamento). Chiamare quindi ID3D11Device::CreateRenderTargetView per creare una visualizzazione di destinazione di rendering per la trama ed eseguire il rendering della scena nella trama. Chiamare infine ID3D11DeviceContext::ResolveSubresource per risolvere la trama multicampionato nella catena di scambio non multicampionato.
La differenza principale tra i modelli di presentazione è il modo in cui il contenuto del buffer nascosto passa a Desktop Window Manager (DWM) per la composizione. Nel modello bitblt, usato con i valori DXGI_SWAP_EFFECT_DISCARD e DXGI_SWAP_EFFECT_SEQUENTIAL, il contenuto del buffer nascosto viene copiato nella superficie di reindirizzamento in ogni chiamata a IDXGISwapChain1::P resent1. Nel modello flip, che viene usato con il valore DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, tutti i buffer back vengono condivisi con DWM. Pertanto, DWM può comporre direttamente da tali buffer back senza operazioni di copia aggiuntive. In generale, il modello flip è il modello più efficiente. Il modello flip offre anche altre funzionalità, ad esempio le statistiche presenti avanzate.
La differenza tra DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD è che DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL forza DXGI a garantire che il contenuto di ogni buffer nascosto venga mantenuto tra le chiamate IDXGISwapChain::Present
, mentre DXGI_SWAP_EFFECT_FLIP_DISCARD non fornisce questa garanzia. Il compositor, in determinati scenari, può usare DirectFlip, in cui usa il buffer nascosto dell'applicazione come buffer nascosto dello schermo intero, che elimina il costo della copia del buffer nascosto dell'applicazione nel buffer back del desktop finale. Con DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD, questa ottimizzazione può verificarsi quando l'applicazione è l'unico elemento visibile sullo schermo. Tuttavia, anche quando l'applicazione non è l'unico elemento visibile sullo schermo, se il modello flip è DXGI_SWAP_EFFECT_FLIP_DISCARD, il compositor può comunque eseguire questa ottimizzazione, disegnando altro contenuto nel buffer nascosto dell'applicazione.
Quando chiami IDXGISwapChain1::P resent1 su una catena di scambio del modello flip (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) con 0 specificato nel parametro SyncInterval, comportamento di IDXGISwapChain1::P resent1corrisponde al comportamento di Direct3D 9ExIDirect3DDevice9Ex::P resentEx con D3DSWAPEFFECT_FLIPEX e D3DPRESENT_FORCEIMMEDIATE. Ovvero, il runtime non solo presenta il fotogramma successivo invece di qualsiasi frame in coda in precedenza, termina anche qualsiasi tempo rimanente lasciato nei fotogrammi in coda in precedenza.
Indipendentemente dal fatto che il modello flip sia più efficiente, un'applicazione potrebbe comunque scegliere il modello bitblt perché il modello bitblt è l'unico modo per combinare GDI e presentazione DirectX. Nel modello flip l'applicazione deve creare la catena di scambio con DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLEe quindi deve usare GetDC nel buffer nascosto in modo esplicito. Dopo la prima chiamata riuscita a IDXGISwapChain1::P resent1 su una catena di scambio flip-model, GDI non funziona più con il HWND associato a tale catena di scambio, anche dopo la distruzione della catena di scambio. Questa restrizione si estende anche a metodi come ScrollWindowEx.
Per visualizzare i formati di buffer della porta di scambio HDR e gli spazi colori, è necessario un modello flip. In caso contrario, vengono composti (e ritagliati) in SDR (sRGB con un intervallo da 0 a 1).
Per altre info sulla catena di scambio del modello flip-model e sull'ottimizzazione della presentazione, vedi Miglioramento della presentazione con il modello di capovolgimento, rettangoli sporchi e aree scorrevoli.
Esempi
Per creare una catena di scambio nella piattaforma UWP, è sufficiente creare una nuova istanza del modello DX11 ed esaminare l'implementazione di DeviceResources::CreateWindowSizeDependentResources
negli esempi di D3D12.
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
)
);
Fabbisogno
Requisito | Valore |
---|---|
intestazione | dxgi.h |
Vedere anche
Per ottenere prestazioni ottimali, usare il modello flip DXGI