Compartilhar via


DXGI_SWAP_EFFECT enumeração (dxgi.h)

Opções para lidar com pixels em uma superfície de exibição depois de chamar IDXGISwapChain1::P resent1.

Sintaxe

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
} ;

Constantes

 
DXGI_SWAP_EFFECT_DISCARD
Valor: 0
Use esse sinalizador para especificar o modelo de transferência de bloco de bits (bitblt) e especificar que o DXGI descarte o conteúdo do buffer de fundo depois de chamar IDXGISwapChain1::P resent1.
Esse sinalizador é válido para uma cadeia de troca com mais de um buffer de fundo, embora os aplicativos tenham acesso de leitura e gravação apenas ao buffer 0.
Use esse sinalizador para permitir que o driver de exibição selecione a técnica de apresentação mais eficiente para a cadeia de troca.

Direct3D 12: Esse valor de enumeração nunca tem suporte. Os aplicativos D3D12 devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

Observação Há diferenças entre a UWP exclusiva em tela inteira e a UWP de tela inteira. Se você estiver portando um aplicativo Direct3D 11 para UWP em um computador Windows, lembre-se de que o uso de DXGI_SWAP_EFFECT_DISCARD ao criar cadeias de troca faz
não se comporta da mesma maneira na UWP como no Win32, e seu uso pode ser prejudicial ao desempenho da GPU.

Isso ocorre porque os aplicativos UWP são forçados a modos de troca FLIP (mesmo se outros modos de troca estiverem definidos), porque isso reduz a computação
tempo usado pelas cópias de memória originalmente feitas pelo modelo bitblt mais antigo.

A abordagem recomendada é converter manualmente cadeias de troca de descarte DX11 para usar modelos flip dentro da UWP, usando DXGI_SWAP_EFFECT_FLIP_DISCARD em vez de DXGI_SWAP_EFFECT_DISCARD sempre que possível.
Consulte o exemplo abaixo e consulte este artigo para obter mais informações.

 
DXGI_SWAP_EFFECT_SEQUENTIAL
Valor: 1
Use esse sinalizador para especificar o modelo bitblt e especificar que o DXGI persista o conteúdo do buffer de fundo depois de chamar IDXGISwapChain1::P resent1.
Use essa opção para apresentar o conteúdo da cadeia de troca em ordem, desde o primeiro buffer (buffer 0) até o último buffer.
Esse sinalizador não pode ser usado com multisampling.

Direct3D 12: Esse valor de enumeração nunca tem suporte. Os aplicativos D3D12 devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.


Observação Para obter o melhor desempenho, use DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL em vez de DXGI_SWAP_EFFECT_SEQUENTIAL. Consulte este artigo para obter mais informações.

 
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
Valor: 3
Use esse sinalizador para especificar o modelo de apresentação de inversão e especificar que o DXGI persista o conteúdo do buffer de fundo depois que você chamar IDXGISwapChain1::P resent1. Esse sinalizador não pode ser usado com multisampling.


Direct3D 11: Esse valor de enumeração tem suporte a partir do Windows 8.
DXGI_SWAP_EFFECT_FLIP_DISCARD
Valor: 4
Use esse sinalizador para especificar o modelo de apresentação de inversão e especificar que o DXGI descarte o conteúdo do buffer de fundo depois de chamar IDXGISwapChain1::P resent1.
Esse sinalizador não pode ser usado com apresentação parcial e multisampling.
Consulte melhorias do DXGI 1.4.


Direct3D 11: Esse valor de enumeração tem suporte a partir do Windows 10.
Esse sinalizador é válido para uma cadeia de troca com mais de um buffer de fundo; embora os aplicativos tenham acesso de leitura e gravação apenas ao buffer 0.


Observação os aplicativos da Windows Store devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

 

Observações

Essa enumeração é usada pelas estruturas DXGI_SWAP_CHAIN_DESC e DXGI_SWAP_CHAIN_DESC1.

No D3D12, há suporte apenas para DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD, e os modelos bitblt não são. Por isso, não há suporte para a multisampação de um buffer de fundo na D3D12 e você deve executar manualmente a multisampling no aplicativo usando ID3D12GraphicsCommandList::ResolveSubresource ou ID3D12GraphicsCommandList1::ResolveSubresourceRegion.

Para usar o multisampling com DXGI_SWAP_EFFECT_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, você deve executar a multisampling em um destino de renderização separado. Por exemplo, crie uma textura multisampada chamando ID3D11Device::CreateTexture2D com uma estrutura de D3D11_TEXTURE2D_DESC preenchida (associado bindFlags definido como D3D11_BIND_RENDER_TARGET e membro SampleDesc com parâmetros multisampling). A próxima chamada ID3D11Device::CreateRenderTargetView para criar uma exibição de destino de renderização para a textura e renderizar sua cena na textura. Por fim, chame ID3D11DeviceContext::ResolveSubresource para resolver a textura multisampled em sua cadeia de troca não multisamplada.

A principal diferença entre os modelos de apresentação é como o conteúdo do back-buffer chega ao DWM (Gerenciador de Janelas da Área de Trabalho) para composição. No modelo bitblt, que é usado com os valores DXGI_SWAP_EFFECT_DISCARD e DXGI_SWAP_EFFECT_SEQUENTIAL, o conteúdo do buffer de fundo é copiado para a superfície de redirecionamento em cada chamada para IDXGISwapChain1::P resent1. No modelo de inversão, que é usado com o valor DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, todos os buffers back são compartilhados com o DWM. Portanto, o DWM pode redigir diretamente desses buffers back sem nenhuma operação de cópia adicional. Em geral, o modelo flip é o modelo mais eficiente. O modelo flip também fornece mais recursos, como estatísticas atuais aprimoradas.

A diferença entre DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD é que DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL força o DXGI a garantir que o conteúdo de cada buffer de fundo seja preservado em IDXGISwapChain::Present chamadas, enquanto DXGI_SWAP_EFFECT_FLIP_DISCARD não fornece essa garantia. O compositor, em determinados cenários, pode usar o DirectFlip, em que usa o buffer de fundo do aplicativo como todo o buffer de back de exibição, o que reduz o custo de copiar o buffer de volta do aplicativo para o buffer de back da área de trabalho final. Com DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD, essa otimização pode ocorrer quando o aplicativo é o único item visível na tela. No entanto, mesmo quando o aplicativo não for o único item visível na tela, se o modelo de inversão for DXGI_SWAP_EFFECT_FLIP_DISCARD, o compositor poderá, em alguns cenários, ainda executar essa otimização, desenhando outro conteúdo no buffer de fundo do aplicativo.

Quando você chama IDXGISwapChain1::P resent1 em uma cadeia de troca de modelo de inversão (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) com 0 especificado no parâmetro SyncInterval, IDXGISwapChain1::P resent1's behavior is the same as behavior of Direct3D 9Ex's IDirect3DDevice9Ex::P resentEx with D3DSWAPEFFECT_FLIPEX and D3DPRESENT_FORCEIMMEDIATE. Ou seja, o runtime não só apresenta o próximo quadro em vez de quaisquer quadros previamente enfileirados, como também encerra qualquer tempo restante restante nos quadros previamente enfileirados.

Independentemente de o modelo de inversão ser mais eficiente, um aplicativo ainda pode escolher o modelo bitblt porque o modelo bitblt é a única maneira de misturar a apresentação GDI e DirectX. No modelo de inversão, o aplicativo deve criar a cadeia de troca com DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLEe, em seguida, deve usar GetDC no buffer de fundo explicitamente. Após a primeira chamada bem-sucedida para IDXGISwapChain1::P resent1 em uma cadeia de troca de modelo de flip, a GDI não funciona mais com o HWND associado a essa cadeia de troca, mesmo após a destruição da cadeia de troca. Essa restrição se estende até mesmo a métodos como ScrollWindowEx.

Para exibir formatos de buffer de troca de HDR e espaços de cor, um modelo de inversão é necessário. Caso contrário, eles são compostos (e recortados) em SDR (sRGB com um intervalo de 0 a 1).

Para obter mais informações sobre a cadeia de troca de modelo flip e a apresentação de otimização, consulte Apresentação de aprimoramento com o modelo de inversão, retângulos sujos e áreas roladas.

Exemplos

Para criar uma cadeia de troca na UWP, basta criar uma nova instância do modelo DX11 e examinar a implementação de DeviceResources::CreateWindowSizeDependentResources nos exemplos de 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
                     )
              );

Requisitos

Requisito Valor
cabeçalho dxgi.h

Consulte também

Enumerações DXGI

Para obter o melhor desempenho, use o modelo de flip DXGI