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 |