Compartilhar via


enumeração DXGI_SWAP_EFFECT (dxgi.h)

Opções para lidar com pixels em uma superfície de exibição depois de chamar 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
} ;

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 traseiro depois de chamar IDXGISwapChain1::P resent1.
Esse sinalizador é válido para uma cadeia de troca com mais de um buffer traseiro, embora os aplicativos tenham acesso somente de leitura e gravação 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: Nunca há suporte para esse valor de enumeração. Os aplicativos D3D12 devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

Nota 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 entrar em modos de troca FLIP (mesmo que outros modos de troca sejam 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 de inversão 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 confira 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 traseiro depois de chamar IDXGISwapChain1::P resent1.
Use essa opção para apresentar o conteúdo da cadeia de troca na ordem, do primeiro buffer (buffer 0) ao último buffer.
Esse sinalizador não pode ser usado com multisampling.

Direct3D 12: Nunca há suporte para esse valor de enumeração. Os aplicativos D3D12 devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.


Nota 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 traseiro depois de chamar IDXGISwapChain1::P resent1. Esse sinalizador não pode ser usado com multisampling.


Direct3D 11: Esse valor de enumeração tem suporte começando com 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 traseiro depois de chamar IDXGISwapChain1::P resent1.
Esse sinalizador não pode ser usado com multisampling e apresentação parcial.
Confira Aprimoramentos do DXGI 1.4.


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


Nota Os aplicativos da Windows Store devem usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

 

Comentários

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. Devido a isso, não há suporte para multisampling de um buffer traseiro em D3D12 e você deve executar manualmente várias amostras no aplicativo usando ID3D12GraphicsCommandList::ResolveSubresource ou ID3D12GraphicsCommandList1::ResolveSubresourceRegion.

Para usar 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 multisamplos chamando ID3D11Device::CreateTexture2D com uma estrutura de D3D11_TEXTURE2D_DESC preenchida (membro BindFlags definido como D3D11_BIND_RENDER_TARGET e membro SampleDesc com parâmetros multisampling). 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 resolve a textura multisampled em sua cadeia de troca não multissampled.

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 traseiro é 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 traseiros são compartilhados com o DWM. Portanto, o DWM pode redigir diretamente desses buffers traseiros sem nenhuma operação de cópia adicional. Em geral, o modelo de inversão é 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 traseiro seja preservado entre 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 traseiro 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 traseiro do aplicativo.

Quando você chama IDXGISwapChain1::P resent1 em uma cadeia de troca de modelo flip (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) com 0 especificado no parâmetro SyncInterval, o comportamento de IDXGISwapChain1::P resent1 é o mesmo que o comportamento de IDirect3DDevice9Ex::P resentEx do Direct3D 9Ex com D3DSWAPEFFECT_FLIPEX e D3DPRESENT_FORCEIMMEDIATE. Ou seja, o runtime não só apresenta o próximo quadro em vez de qualquer quadro anteriormente enfileirado, como também encerra qualquer tempo restante restante nos quadros previamente enfileirados.

Independentemente de o modelo flip 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_COMPATIBLE e, em seguida, deve usar GetDC no buffer traseiro explicitamente. Após a primeira chamada bem-sucedida para IDXGISwapChain1::P resent1 em uma cadeia de troca de modelo 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 obter mais informações sobre a cadeia de troca de modelo flip e a apresentação de otimização, consulte Aprimorando a apresentação com o modelo de inversão, sujo retângulos 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 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

Confira também

Enumerações DXGI

Para obter melhor desempenho, use o modelo de inversão DXGI