enumerazione DXGI_SWAP_EFFECT (dxgi.h)

Opzioni per la gestione dei pixel in un'area 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 specificare che DXGI elimina il contenuto del buffer back dopo aver chiamato IDXGISwapChain1::P resent1.
Questo flag è valido per una catena di scambio con più buffer back, anche se le applicazioni dispongono solo di accesso in lettura e scrittura al buffer 0.
Usare questo flag per abilitare il driver di visualizzazione per 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 UWP a schermo intero ed esclusivo a schermo intero. Se si esegue la conversione di un'applicazione Direct3D 11 in un PC Windows, tenere presente che l'uso di DXGI_SWAP_EFFECT_DISCARD durante la creazione di catene di scambio fa
non si comportano allo stesso modo in UWP come in Win32 e il suo uso può essere dannoso per le prestazioni della GPU.

Ciò avviene perché le applicazioni UWP vengono forzate in modalità di scambio FLIP (anche se sono impostate altre modalità di scambio), perché questo riduce il calcolo
tempo utilizzato dalle copie di memoria originariamente eseguite dal modello bitblt precedente.

L'approccio consigliato consiste nel convertire manualmente le catene di scambio DX11 per usare modelli di scorrimento all'interno della piattaforma UWP, usando DXGI_SWAP_EFFECT_FLIP_DISCARD anziché DXGI_SWAP_EFFECT_DISCARD se 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 indietro dopo aver chiamato IDXGISwapChain1::P resent1.
Usare 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 indietro 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 di capovolgimento e specificare che DXGI elimina il contenuto del buffer indietro dopo aver chiamato IDXGISwapChain1::P resent1.
Questo flag non può essere usato con multicampionamento e presentazione parziale.
Vedere Miglioramenti di DXGI 1.4.


Direct3D 11: Questo valore di enumerazione è supportato a partire da Windows 10.
Questo flag è valido per una catena di scambio con più buffer back; 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.

 

Commenti

Questa enumerazione viene usata 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 non sono supportati. A causa di questo, la multicampionamento di un buffer back non è supportata in D3D12 e è necessario eseguire manualmente l'esecuzione di multicampion nell'app usando ID3D12GraphicsCommandList::ResolveSubresource o ID3D12GraphicsCommandList1::ResolveSubresourceRegion.

Per usare la 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 multiampled chiamando ID3D11Device::CreateTexture2D con una struttura di 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 e eseguire il rendering della scena nella trama. Infine chiamare ID3D11DeviceContext::ResolveSubresource per risolvere la trama multisampled nella catena di scambio non multisampled.

La differenza principale tra i modelli di presentazione è il modo in cui il contenuto del buffer di back-buffer viene restituito 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 indietro viene copiato nell'area di reindirizzamento in ogni chiamata a IDXGISwapChain1::P resent1. Nel modello di capovolgimento, 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 indietro senza alcuna operazione di copia aggiuntiva. In generale, il modello flip è il modello più efficiente. Il modello di capovolgimento offre anche altre funzionalità, ad esempio statistiche avanzate presenti.

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 back venga mantenuto tra IDXGISwapChain::Present chiamate, mentreDXGI_SWAP_EFFECT_FLIP_DISCARD non fornisce questa garanzia. Il compositore, in determinati scenari, può usare DirectFlip, in cui usa il buffer indietro dell'applicazione come intero buffer back di visualizzazione, che elide il costo della copia del buffer back 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 di capovolgimento è DXGI_SWAP_EFFECT_FLIP_DISCARD, il compositore può comunque eseguire questa ottimizzazione, disegnando altri contenuti nel buffer indietro dell'applicazione.

Quando si chiama IDXGISwapChain1::P resent1 in una catena di scambio di modelli capovolgimento (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) con 0 specificati nel parametro SyncInterval , IDXGISwapChain1::P resent1 è lo stesso comportamento di IDirect3D 9Ex'sIDirect3DDevice9Ex::P resentEx con D3DSWAPEFFECT_FLIPEXe D3DPRESENT_FORCEIMMEDIATE. Ovvero, il runtime non solo presenta il frame successivo anziché qualsiasi frame precedentemente accodato, termina anche qualsiasi tempo rimanente lasciato nei fotogrammi in coda precedentemente.

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 la presentazione GDI e DirectX. Nel modello di scorrimento, l'applicazione deve creare la catena di scambio con DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE e quindi deve usare GetDC nel buffer indietro in modo esplicito. Dopo la prima chiamata riuscita a IDXGISwapChain1::P resent1 in una catena di scambio di modelli flip, 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 ai metodi come ScrollWindowEx.

Per altre informazioni sulla catena di scambio del modello capovolgimento e sull'ottimizzazione della presentazione, vedere Miglioramento della presentazione con il modello di capovolgimento, i rettangoli sporchi e le aree a scorrimento.

Esempio

Per creare una catena di scambio in UWP, è sufficiente creare una nuova istanza del modello DX11 e esaminare l'implementazione di DeviceResources::CreateWindowSizeDependentResources negli esempi 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
                     )
              );

Requisiti

Requisito Valore
Intestazione dxgi.h

Vedi anche

Enumerazioni DXGI

Per prestazioni ottimali, usare il modello flip DXGI