Representación inmediata y diferida

Direct3D 11 admite dos tipos de representación: inmediato y diferido. Ambos se implementan mediante la interfaz ID3D11DeviceContext .

Representación inmediata

La representación inmediata hace referencia a llamar a las API o comandos de representación desde un dispositivo, que pone en cola los comandos en un búfer para su ejecución en la GPU. Use un contexto inmediato para representar, establecer el estado de la canalización y reproducir una lista de comandos.

Cree un contexto inmediato mediante D3D11CreateDevice o D3D11CreateDeviceAndSwapChain.

Representación diferida

La representación diferida registra comandos gráficos en un búfer de comandos para que se puedan reproducir en algún otro momento. Use un contexto diferido para registrar comandos (representación y configuración de estado) en una lista de comandos. La representación diferida es un nuevo concepto en Direct3D 11; la representación diferida está diseñada para admitir la representación en un subproceso mientras se graban comandos para la representación en subprocesos adicionales. Esta estrategia paralela y multiproceso permite dividir escenas complejas en tareas simultáneas. Para obtener más información sobre la representación de escenas complejas, vea Representación de varios pasos.

Cree un contexto diferido mediante ID3D11Device::CreateDeferredContext.

Direct3D genera una sobrecarga de representación cuando pone en cola comandos en el búfer de comandos. Por el contrario, una lista de comandos se ejecuta mucho más eficazmente durante la reproducción. Para usar una lista de comandos, registre los comandos de representación con un contexto diferido y reproduzca con un contexto inmediato.

Solo puede generar una lista de comandos única de manera uniproceso. Sin embargo, puede crear y usar varios contextos diferidos simultáneamente, cada uno de ellos en un subproceso independiente. A continuación, puede usar esos varios contextos diferidos para crear simultáneamente varias listas de comandos.

No se pueden reproducir dos o más listas de comandos simultáneamente en el contexto inmediato.

Para determinar si un contexto de dispositivo es inmediato o un contexto diferido, llame a ID3D11DeviceContext::GetType.

El método ID3D11DeviceContext::Map solo se admite en un contexto diferido para recursos dinámicos (D3D11_USAGE_DYNAMIC) donde se D3D11_MAP_WRITE_DISCARD la primera llamada dentro de la lista de comandos. D3D11_MAP_WRITE_NO_OVERWRITE se admite en llamadas posteriores si están disponibles para el tipo de recurso especificado.

Las consultas en un contexto diferido se limitan a la generación de datos y al dibujo prefijo. No se puede llamar a ID3D11DeviceContext::GetData en un contexto diferido para obtener datos sobre una consulta; Solo puede llamar a GetData en el contexto inmediato para obtener datos sobre una consulta. Puede establecer un predicado de representación (un tipo de consulta) llamando a D3D11DeviceContext::SetPredication para usar los resultados de la consulta en la GPU. Puede generar datos de consulta a través de llamadas a ID3D11DeviceContext::Begin e ID3D11DeviceContext::End. Sin embargo, los datos de consulta no estarán disponibles hasta que llame a ID3D11DeviceContext::ExecuteCommandList en el contexto inmediato para enviar la lista de comandos de contexto diferido. A continuación, la GPU procesa los datos de consulta.

Multithreading