Partilhar via


Renderização imediata e diferida

O Direct3D 11 suporta dois tipos de renderização: imediata e adiada. Ambos são implementados usando o ID3D11DeviceContext interface.

Renderização imediata

A renderização imediata refere-se à chamada de APIs ou comandos de renderização 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 comandos para que eles possam ser reproduzidos em algum outro momento. Use um contexto adiado para gravar comandos (renderização e 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 suportar a 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 Multiple-Pass renderização.

Crie um contexto adiado usando ID3D11Device::CreateDeferredContext.

O Direct3D gera sobrecarga de renderização quando enfileira comandos no buffer de comandos. Em contraste, uma lista de comandos é executada de forma muito mais eficiente durante a reprodução. Para usar uma lista de comandos, grave os 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 forma single-threaded. 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 é imediato ou adiado, chame ID3D11DeviceContext::GetType.

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

As consultas em um contexto adiado são limitadas à geração de dados e ao desenho predicado. Não é possível 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 de 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 de consulta são então processados pela GPU.

Multithreading