Compartilhar via


Método ID3D11DeviceContext::Flush (d3d11.h)

Envia comandos enfileirados no buffer de comandos para a GPU (unidade de processamento gráfico).

Sintaxe

void Flush();

Valor retornado

Nenhum

Comentários

A maioria dos aplicativos não precisa chamar esse método. Se um aplicativo chamar esse método quando não for necessário, ele incorre em uma penalidade de desempenho. Cada chamada para Flush incorre em uma quantidade significativa de sobrecarga.

Quando os comandos state-setting, present ou draw do Microsoft Direct3D são chamados por um aplicativo, esses comandos são enfileirados em um buffer de comando interno. Flush envia esses comandos para a GPU para processamento. Normalmente, o runtime do Direct3D envia esses comandos para a GPU automaticamente sempre que o runtime determina que eles precisam ser enviados, como quando o buffer de comando está cheio ou quando um aplicativo mapeia um recurso. Flush envia os comandos manualmente.

Recomendamos que você use Flush quando a CPU aguardar um período arbitrário de tempo (como quando você chama a função Suspensão ).

Como o Flush opera de forma assíncrona, ele pode retornar antes ou depois que a GPU terminar de executar os comandos gráficos enfileirados. No entanto, os comandos gráficos eventualmente sempre são concluídos. Você pode chamar o método ID3D11Device::CreateQuery com o valor D3D11_QUERY_EVENT para criar uma consulta de evento; Em seguida, você pode usar essa consulta de evento em uma chamada para o método ID3D11DeviceContext::GetData para determinar quando a GPU terminou de processar os comandos gráficos.

O Microsoft Direct3D 11 adia a destruição de objetos. Portanto, um aplicativo não pode depender de objetos que estão sendo destruídos imediatamente. Chamando Flush, você destrói todos os objetos cuja destruição foi adiada. Se um aplicativo exigir destruição síncrona de um objeto, recomendamos que o aplicativo libere todas as suas referências, chame ID3D11DeviceContext::ClearState e, em seguida, chame Flush.

Problemas de destruição adiada com cadeias de troca de apresentação flip

O Direct3D 11 adia a destruição de objetos como exibições e recursos até que ele possa destruí-los com eficiência. Essa destruição adiada pode causar problemas com cadeias de troca de modelo de apresentação de inversão. As cadeias de troca do modelo de apresentação flip têm o sinalizador DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL definido. Ao criar uma cadeia de troca de modelo de apresentação de inversão, você pode associar apenas uma cadeia de troca por vez a uma superfície HWND, IWindow ou de composição. Se um aplicativo tentar destruir uma cadeia de troca de modelo de apresentação de inversão e substituí-la por outra cadeia de troca, a cadeia de troca original não será destruída quando o aplicativo liberar imediatamente todas as referências da cadeia de troca original.

A maioria dos aplicativos normalmente usa o método IDXGISwapChain::ResizeBuffers para a maioria dos cenários em que eles substituem novos buffers de cadeia de troca para buffers de cadeia de troca antigos. No entanto, se um aplicativo precisar realmente destruir uma cadeia de troca antiga e criar uma nova cadeia de troca, o aplicativo deverá forçar a destruição de todos os objetos que o aplicativo liberou. Para forçar a destruição, chame ID3D11DeviceContext::ClearState (ou verifique se nenhuma exibição está associada ao estado do pipeline) e, em seguida, chame Flush no contexto imediato. Você deve forçar a destruição antes de chamar IDXGIFactory2::CreateSwapChainForHwnd, IDXGIFactory2::CreateSwapChainForCoreWindow ou IDXGIFactory2::CreateSwapChainForComposition novamente para criar uma nova cadeia de troca.

Requisitos

   
Plataforma de Destino Windows
Cabeçalho d3d11.h
Biblioteca D3D11.lib

Confira também

ID3D11DeviceContext