Partager via


Rendu immédiat et différé

Direct3D 11 prend en charge deux types de rendu : immédiat et différé. Les deux sont implémentés à l’aide de l’interface ID3D11DeviceContext .

Rendu immédiat

Le rendu immédiat fait référence à l’appel d’API de rendu ou de commandes à partir d’un appareil, qui met en file d’attente les commandes dans une mémoire tampon pour une exécution sur le GPU. Utilisez un contexte immédiat pour afficher, définir l’état du pipeline et lire une liste de commandes.

Créez un contexte immédiat à l’aide de D3D11CreateDevice ou D3D11CreateDeviceAndSwapChain.

Rendu différé

Le rendu différé enregistre les commandes graphiques dans une mémoire tampon de commandes afin qu’elles puissent être lues à un autre moment. Utilisez un contexte différé pour enregistrer des commandes (rendu et paramètre d’état) dans une liste de commandes. Le rendu différé est un nouveau concept dans Direct3D 11 ; le rendu différé est conçu pour prendre en charge le rendu sur un thread lors de l’enregistrement de commandes pour le rendu sur d’autres threads. Cette stratégie parallèle et multithread vous permet de diviser des scènes complexes en tâches simultanées. Pour plus d’informations sur le rendu de scènes complexes, consultez Rendu à pas multiples.

Créez un contexte différé à l’aide de ID3D11Device::CreateDeferredContext.

Direct3D génère une surcharge de rendu lorsqu’il met en file d’attente les commandes dans la mémoire tampon de commandes. En revanche, une liste de commandes s’exécute beaucoup plus efficacement pendant la lecture. Pour utiliser une liste de commandes, enregistrez les commandes de rendu avec un contexte différé et lisez-les à l’aide d’un contexte immédiat.

Vous ne pouvez générer qu’une seule liste de commandes de manière monothread. Toutefois, vous pouvez créer et utiliser simultanément plusieurs contextes différés, chacun dans un thread distinct. Ensuite, vous pouvez utiliser ces plusieurs contextes différés pour créer simultanément plusieurs listes de commandes.

Vous ne pouvez pas lire deux listes de commandes ou plus simultanément dans le contexte immédiat.

Pour déterminer si un contexte d’appareil est un contexte immédiat ou différé, appelez ID3D11DeviceContext::GetType.

La méthode ID3D11DeviceContext::Map est uniquement prise en charge dans un contexte différé pour les ressources dynamiques (D3D11_USAGE_DYNAMIC) où le premier appel de la liste de commandes est D3D11_MAP_WRITE_DISCARD. D3D11_MAP_WRITE_NO_OVERWRITE est pris en charge sur les appels suivants, s’il est disponible pour le type de ressource donné.

Les requêtes dans un contexte différé sont limitées à la génération de données et au dessin prédicé. Vous ne pouvez pas appeler ID3D11DeviceContext::GetData sur un contexte différé pour obtenir des données sur une requête ; vous pouvez uniquement appeler GetData dans le contexte immédiat pour obtenir des données sur une requête. Vous pouvez définir un prédicat de rendu (type de requête) en appelant D3D11DeviceContext::SetPredication pour utiliser les résultats de la requête sur le GPU. Vous pouvez générer des données de requête par le biais d’appels à ID3D11DeviceContext::Begin et ID3D11DeviceContext::End. Toutefois, les données de requête ne seront pas disponibles tant que vous n’appelez pas ID3D11DeviceContext::ExecuteCommandList sur le contexte immédiat pour envoyer la liste de commandes de contexte différée. Les données de requête sont ensuite traitées par le GPU.

Traitement multithread