Compartilhar via


Renderização imediata e adiada

O Direct3D 11 dá suporte a dois tipos de renderização: imediato e adiado. Ambos são implementados usando a interface ID3D11DeviceContext .

Renderização imediata

A renderização imediata refere-se à chamada de APIs de renderização ou comandos de um dispositivo, que enfileira os comandos em um buffer para execução na GPU. Use um contexto imediato para renderizar, definir o estado do pipeline e reproduzir uma lista de comandos.

Crie um contexto imediato usando D3D11CreateDevice ou D3D11CreateDeviceAndSwapChain.

Renderização Adiada

A renderização adiada registra comandos gráficos em um buffer de comando para que eles possam ser reproduzidos em algum outro momento. Use um contexto adiado para registrar comandos (renderização, bem como configuração de estado) em uma lista de comandos. A renderização adiada é um novo conceito no Direct3D 11; A renderização adiada foi projetada para dar suporte à renderização em um thread durante a gravação de comandos para renderização em threads adicionais. Essa estratégia paralela e multithread permite dividir cenas complexas em tarefas simultâneas. Para obter mais informações sobre como renderizar cenas complexas, consulte Renderização de várias passagens.

Crie um contexto adiado usando ID3D11Device::CreateDeferredContext.

O Direct3D gera sobrecarga de renderização quando enfileira comandos no buffer de comandos. Por outro lado, uma lista de comandos é executada com muito mais eficiência durante a reprodução. Para usar uma lista de comandos, registre comandos de renderização com um contexto adiado e reproduza-os usando um contexto imediato.

Você pode gerar apenas uma única lista de comandos de maneira única. No entanto, você pode criar e usar vários contextos adiados simultaneamente, cada um em um thread separado. Em seguida, você pode usar esses vários contextos adiados para criar simultaneamente várias listas de comandos.

Não é possível reproduzir duas ou mais listas de comandos simultaneamente no contexto imediato.

Para determinar se um contexto de dispositivo é um contexto imediato ou adiado, chame ID3D11DeviceContext::GetType.

O método ID3D11DeviceContext::Map só tem suporte em um contexto adiado para recursos dinâmicos (D3D11_USAGE_DYNAMIC) em que a primeira chamada na lista de comandos é D3D11_MAP_WRITE_DISCARD. D3D11_MAP_WRITE_NO_OVERWRITE tem suporte em chamadas subsequentes, se disponível para o tipo de recurso fornecido.

As consultas em um contexto adiado são limitadas à geração de dados e ao desenho predefinido. Você não pode chamar ID3D11DeviceContext::GetData em um contexto adiado para obter dados sobre uma consulta; você só pode chamar GetData no contexto imediato para obter dados sobre uma consulta. Você pode definir um predicado de renderização (um tipo de consulta) chamando D3D11DeviceContext::SetPredication para usar os resultados da consulta na GPU. Você pode gerar dados de consulta por meio de chamadas para ID3D11DeviceContext::Begin e ID3D11DeviceContext::End. No entanto, os dados da consulta não estarão disponíveis até que você chame ID3D11DeviceContext::ExecuteCommandList no contexto imediato para enviar a lista de comandos de contexto adiado. Os dados da consulta são processados pela GPU.

Multithread