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 |