ID3D11DeviceContext::Flush, méthode (d3d11.h)
Envoie des commandes mises en file d’attente dans la mémoire tampon de commandes à l’unité de traitement graphique (GPU).
Syntaxe
void Flush();
Valeur de retour
Aucune
Remarques
La plupart des applications n’ont pas besoin d’appeler cette méthode. Si une application appelle cette méthode lorsque ce n’est pas nécessaire, cela entraîne une pénalité de performances. Chaque appel à Flush entraîne une surcharge importante.
Lorsque des commandes microsoft Direct3D state-setting, present ou draw sont appelées par une application, ces commandes sont mises en file d’attente dans une mémoire tampon de commandes interne. Flush envoie ces commandes au GPU pour traitement. En règle générale, le runtime Direct3D envoie ces commandes au GPU automatiquement chaque fois que le runtime détermine qu’elles doivent être envoyées, par exemple quand la mémoire tampon de commandes est saturée ou lorsqu’une application mappe une ressource. Le vidage envoie les commandes manuellement.
Nous vous recommandons d’utiliser Flush lorsque le processeur attend un temps arbitraire (par exemple, lorsque vous appelez la fonction Veille ).
Étant donné que Flush fonctionne de manière asynchrone, il peut retourner avant ou après la fin de l’exécution des commandes graphiques mises en file d’attente par le GPU. Toutefois, les commandes graphiques finissent toujours par se terminer. Vous pouvez appeler la méthode ID3D11Device::CreateQuery avec la valeur D3D11_QUERY_EVENT pour créer une requête d’événement ; vous pouvez ensuite utiliser cette requête d’événement dans un appel à la méthode ID3D11DeviceContext::GetData pour déterminer quand le GPU a fini de traiter les commandes graphiques.
Microsoft Direct3D 11 reporte la destruction des objets. Par conséquent, une application ne peut pas s’appuyer sur des objets immédiatement détruits. En appelant Flush, vous détruisez tous les objets dont la destruction a été différée. Si une application nécessite une destruction synchrone d’un objet, nous vous recommandons de libérer toutes ses références, d’appeler ID3D11DeviceContext::ClearState, puis d’appeler Flush.
Problèmes de destruction différée avec les chaînes d’échange de présentations inversées
Direct3D 11 reporte la destruction d’objets tels que les vues et les ressources jusqu’à ce qu’il puisse les détruire efficacement. Cette destruction différée peut entraîner des problèmes avec les chaînes de permutation de modèle de présentation inversée. Les chaînes d’échange de modèle de présentation inversée ont l’indicateur DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL défini. Lorsque vous créez une chaîne d’échange de modèle de présentation à retournement, vous ne pouvez associer qu’une seule chaîne d’échange à la fois à une surface HWND, IWindow ou de composition. Si une application tente de détruire une chaîne d’échange de modèle de présentation inversée et de la remplacer par une autre chaîne d’échange, la chaîne d’échange d’origine n’est pas détruite lorsque l’application libère immédiatement toutes les références de la chaîne d’échange d’origine.La plupart des applications utilisent généralement la méthode IDXGISwapChain::ResizeBuffers pour la majorité des scénarios où elles remplacent les nouvelles mémoires tampons de chaîne d’échange pour les anciennes mémoires tampons de chaîne d’échange. Toutefois, si une application doit réellement détruire une ancienne chaîne d’échange et créer une nouvelle chaîne d’échange, l’application doit forcer la destruction de tous les objets libérés par l’application. Pour forcer la destruction, appelez ID3D11DeviceContext::ClearState (ou vérifiez qu’aucune vue n’est liée à l’état du pipeline), puis appelez Flush sur le contexte immédiat. Vous devez forcer la destruction avant d’appeler IDXGIFactory2::CreateSwapChainForHwnd, IDXGIFactory2::CreateSwapChainForCoreWindow ou IDXGIFactory2::CreateSwapChainForComposition pour créer une chaîne d’échange.
Configuration requise
Plateforme cible | Windows |
En-tête | d3d11.h |
Bibliothèque | D3D11.lib |