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

Envía comandos en cola en el búfer de comandos a la unidad de procesamiento de gráficos (GPU).

Sintaxis

void Flush();

Valor devuelto

None

Observaciones

La mayoría de las aplicaciones no necesitan llamar a este método. Si una aplicación llama a este método cuando no es necesario, incurre en una penalización de rendimiento. Cada llamada a Flush incurre en una cantidad significativa de sobrecarga.

Cuando una aplicación llama a los comandos de configuración de estado, presentes o draw de Microsoft Direct3D, esos comandos se ponen en cola en un búfer de comandos interno. Flush envía esos comandos a la GPU para su procesamiento. Normalmente, el tiempo de ejecución de Direct3D envía estos comandos a la GPU automáticamente cada vez que el tiempo de ejecución determina que deben enviarse, como cuando el búfer de comandos está lleno o cuando una aplicación asigna un recurso. Flush envía los comandos manualmente.

Se recomienda usar Flush cuando la CPU espere una cantidad arbitraria de tiempo (por ejemplo, al llamar a la función Sleep ).

Dado que Flush funciona de forma asincrónica, puede devolver antes o después de que la GPU termine de ejecutar los comandos gráficos en cola. Sin embargo, los comandos de gráficos siempre se completan. Puede llamar al método ID3D11Device::CreateQuery con el valor D3D11_QUERY_EVENT para crear una consulta de eventos; Después, puede usar esa consulta de eventos en una llamada al método ID3D11DeviceContext::GetData para determinar cuándo la GPU ha terminado de procesar los comandos gráficos.

Microsoft Direct3D 11 aplaza la destrucción de objetos. Por lo tanto, una aplicación no puede confiar en objetos que se destruyen inmediatamente. Al llamar a Flush, se destruyen los objetos cuya destrucción se aplaza. Si una aplicación requiere destrucción sincrónica de un objeto, se recomienda que la aplicación libere todas sus referencias, llame a ID3D11DeviceContext::ClearState y, a continuación, llame a Flush.

Problemas de destrucción diferidos con cadenas de intercambio de presentación invertida

Direct3D 11 aplaza la destrucción de objetos como vistas y recursos hasta que pueda destruirlos de forma eficaz. Esta destrucción diferida puede causar problemas con cadenas de intercambio de modelos de presentación invertida. Las cadenas de intercambio de modelos de presentación invertida tienen establecida la marca DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL . Al crear una cadena de intercambio de modelos de presentación invertida, solo puede asociar una cadena de intercambio a la vez con una superficie de composición, IWindow o HWND. Si una aplicación intenta destruir una cadena de intercambio de modelos de presentación invertida y reemplazarla por otra cadena de intercambio, la cadena de intercambio original no se destruye cuando la aplicación libera inmediatamente todas las referencias de la cadena de intercambio original.

La mayoría de las aplicaciones suelen usar el método IDXGISwapChain::ResizeBuffers para la mayoría de los escenarios en los que reemplazan nuevos búferes de cadena de intercambio para los búferes de cadena de intercambio antiguos. Sin embargo, si una aplicación debe destruir realmente una cadena de intercambio antigua y crear una nueva cadena de intercambio, la aplicación debe forzar la destrucción de todos los objetos liberados por la aplicación. Para forzar la destrucción, llame a ID3D11DeviceContext::ClearState (o, de lo contrario, asegúrese de que no hay vistas enlazadas al estado de canalización) y, a continuación, llame a Flush en el contexto inmediato. Debe forzar la destrucción antes de llamar a IDXGIFactory2::CreateSwapChainForHwnd, IDXGIFactory2::CreateSwapChainForCoreWindow o IDXGIFactory2::CreateSwapChainForComposition de nuevo para crear una nueva cadena de intercambio.

Requisitos

   
Plataforma de destino Windows
Encabezado d3d11.h
Library D3D11.lib

Consulte también

ID3D11DeviceContext