Pour de meilleures performances, utilisez le modèle de retournement DXGI

Cette rubrique fournit des conseils aux développeurs sur la façon d’optimiser les performances et l’efficacité de la pile de présentation sur les versions modernes de Windows. Il reprend là où le modèle de retournement DXGI, DirectX 12 : Modes de présentation dans Windows 10 (vidéo) et améliorations de la présentation dans Windows 10 : une apparence anticipée (vidéo) s’est arrêté.

Appel à l’action

Si vous utilisez toujours DXGI_SWAP_EFFECT_DISCARD ou DXGI_SWAP_EFFECT_SEQUENTIAL (c’est-à-dire le modèle actuel « blt »), il est temps d’arrêter !

Le passage à DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD (c’est-à-dire le modèle de retournement) offre de meilleures performances, une utilisation de l’alimentation plus faible et fournit un ensemble plus riche de fonctionnalités. (Pour plus d’informations sur ces valeurs , consultez énumération DXGI_SWAP_EFFECT .)

Les présents de modèle flip vont jusqu’à rendre le mode fenêtré effectivement équivalent ou meilleur par rapport au mode « exclusif plein écran » classique. En fait, vous souhaiterez peut-être reconsidérer si votre application a réellement besoin d’un mode exclusif plein écran, car les avantages d’une fenêtre sans bordure de modèle à retournement incluent un changement de Alt-Tab plus rapide et une meilleure intégration avec les fonctionnalités d’affichage modernes.

Pourquoi maintenant ? Avant la mise à jour d’avril 2018, les présentations du modèle blt pouvaient entraîner une déchirure visible lorsqu’elles sont utilisées sur des configurations GPU hybrides, souvent présentes dans les ordinateurs portables haut de gamme (voir Kb 3158621). Dans la mise à jour d’avril 2018, cette déchirure a été corrigée, au prix de quelques travaux supplémentaires. Si vous effectuez des présentations blt à des fréquences d’images élevées sur des GPU hybrides, en particulier à des résolutions élevées telles que 4K, ce travail supplémentaire peut affecter les performances globales. Pour maintenir les meilleures performances sur ces systèmes, passez du modèle blt au modèle actuel de retournement. En outre, envisagez de réduire la résolution de votre chaîne d’échange, en particulier s’il ne s’agit pas du point d’interaction principal de l’utilisateur (comme c’est souvent le cas avec les fenêtres d’évaluation vr).

Un bref historique

Qu’est-ce que le modèle de retournement ? Quelle est l’alternative ?

Avant Windows 7, la seule façon de présenter du contenu à partir de D3D était de le copier dans une surface appartenant à la fenêtre ou à l’écran. En commençant par l’effet d’échange FLIPEX de D3D9 et en passant par DXGI via l’effet d’échange FLIP_SEQUENTIAL dans Windows 8, nous avons développé un moyen plus efficace de mettre du contenu à l’écran en le partageant directement avec le compositeur de bureau, avec un minimum de copies. Pour obtenir une vue d’ensemble générale de la technologie, consultez Modèle de retournement DXGI .

Cette optimisation est possible grâce au DWM (Desktop Window Manager), qui est le compositeur qui pilote le bureau Windows.

Quand dois-je utiliser le modèle blt ?

Il existe un élément de fonctionnalité que le modèle de retournement ne fournit pas : la possibilité d’avoir plusieurs API différentes produisant du contenu, qui sont toutes regroupées dans le même HWND, présent par présent. Par exemple, vous pouvez utiliser D3D pour dessiner un arrière-plan de fenêtre, puis Windows GDI pour dessiner quelque chose par-dessus, ou utiliser deux API graphiques différentes, ou deux chaînes d’échange de la même API, pour produire des images en alternance. Si vous n’avez pas besoin de l’interopérabilité de niveau HWND entre les composants graphiques, vous n’avez pas besoin du modèle blt.

Il existe une deuxième fonctionnalité qui n’était pas fournie dans la conception du modèle à retournement d’origine, mais qui est disponible maintenant, qui est la possibilité de présenter à une fréquence d’images non définie. Pour une application utilisant l’intervalle de synchronisation 0, nous vous déconseillons de basculer le modèle, sauf si l’API IDXGIFactory5::CheckFeatureSupport est disponible et signale la prise en charge de DXGI_FEATURE_PRESENT_ALLOW_TEARING. Cette fonctionnalité est presque omniprésente sur les versions récentes de Windows 10 et sur le matériel moderne.

DirectFlip

Si vous avez regardé DirectX 12 : Modes de présentation dans Windows 10, vous verrez parler de « Direct Flip » et « Flip indépendant ». Il s’agit d’optimisations activées pour les applications utilisant des chaînes d’échange de modèle inversé. Selon la configuration de la fenêtre et de la mémoire tampon, il est possible de contourner entièrement la composition du bureau et d’envoyer directement des trames d’application à l’écran, de la même façon que le mode plein écran exclusif.

De nos jours, ces optimisations peuvent s’impliquer dans l’un des 3 scénarios, dans l’ordre d’augmentation des fonctionnalités :

  1. DirectFlip : vos mémoires tampons de chaîne d’échange correspondent aux dimensions de l’écran, et votre région cliente de fenêtre couvre l’écran. Au lieu d’utiliser la chaîne d’échange DWM à afficher à l’écran, la chaîne d’échange d’application est utilisée.
  2. DirectFlip avec des montages de panneau : la région de votre client de fenêtre couvre l’écran, et vos mémoires tampons de chaîne d’échange se trouvent dans un facteur de mise à l’échelle dépendant du matériel (par exemple, 0,25x à 4x) de l’écran. Le matériel de balayage GPU est utilisé pour mettre à l’échelle votre mémoire tampon lors de son envoi à l’affichage.
  3. DirectFlip avec superposition multiplan (MPO) : vos mémoires tampons de chaîne d’échange se trouvent dans un facteur de mise à l’échelle dépendant du matériel de vos dimensions de fenêtre. Le DWM est en mesure de réserver un plan de balayage matériel dédié pour votre application, qui est ensuite analysé et potentiellement étendu à une sous-région de fusion alpha de l’écran.

Avec le modèle de retournement fenêtré, l’application peut interroger la prise en charge matérielle de différents scénarios DirectFlip et implémenter différents types de mise à l’échelle dynamique via l’utilisation d’IDXGIOutput6::CheckHardwareCompositionSupport. Une mise en garde à garder à l’esprit est que si des monteurs de panneaux sont utilisés, il est possible que le curseur souffre d’effets secondaires étirants, ce qui est indiqué par DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.

Une fois que votre chaîne d’échange a été « DirectFlipped », le DWM peut être mis en veille et ne se réveiller que lorsque quelque chose change en dehors de votre application. Vos trames d’application sont envoyées directement à l’écran, indépendamment, avec la même efficacité que l’exclusivité plein écran. Il s’agit d’un « flip indépendant » qui peut s’impliquer dans tous les scénarios ci-dessus. Si d’autres contenus de bureau sont affichés en haut, le DWM peut soit revenir en toute transparence en mode composé, « inverser » efficacement le contenu par-dessus l’application avant de la retourner, soit tirer parti de MPO pour maintenir le mode de retournement indépendant.

Consultez l’outil PresentMon pour savoir lequel des éléments ci-dessus a été utilisé.

Quelles sont les autres nouveautés du modèle de retournement ?

En plus des améliorations ci-dessus, qui s’appliquent aux chaînes d’échange standard sans rien de spécial, il existe plusieurs fonctionnalités disponibles pour les applications de modèle à retournement à utiliser :

  • Diminution de la latence à l’aide de DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. En mode Flip indépendant, vous pouvez descendre à 1 trame de latence sur les versions récentes de Windows, avec une solution de secours appropriée au minimum lorsqu’elle est composée.
    • Mise en garde : un problème a donné au moins deux images de latence dans la mise à jour anniversaire Windows 10 et les versions antérieures. Pour plus d’informations, consultez cette rubrique du forum . Ce problème est résolu dans la mise à jour du créateur d’automne.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD active un mode de « composition inversée » de retournement direct, ce qui entraîne moins de travail global pour afficher le bureau. Le DWM peut gribouiller sur les mémoires tampons d’application et les envoyer à l’écran, au lieu d’effectuer une copie complète dans leurs propres chaînes d’échange.
  • DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING pouvez activer une latence encore plus faible que l’objet d’attente, même dans une fenêtre sur des systèmes avec prise en charge de la superposition multiplan.
  • Les applications contrôlent la mise à l’échelle du contenu qui se produit pendant le redimensionnement de la fenêtre, à l’aide de la propriété DXGI_SCALING définie lors de la création de la chaîne d’échange.
  • Le contenu au format HDR (R10G10B10A2_UNORM ou R16G16B16A16_FLOAT) n’est pas limité, sauf s’il est composé sur un bureau SDR.
  • Les statistiques actuelles sont disponibles en mode fenêtré.
  • Il existe une meilleure compatibilité avec le modèle d’application UWP (plateforme Windows universelle) et DX12, car ceux-ci ne sont compatibles qu’avec le modèle de retournement.

Que dois-je faire pour utiliser le modèle de retournement ?

Les swapchains de modèle flip ont quelques exigences supplémentaires en plus des swapchains blt :

  1. Le nombre de mémoires tampons doit être d’au moins 2.
  2. Après les appels présents , la mémoire tampon d’arrière-mémoire doit être explicitement re-liée au contexte immédiat D3D11 avant de pouvoir être réutilisée.
  3. Après avoir appelé SetFullscreenState, l’application doit appeler ResizeBuffers avant Present.
  4. Les chaînes d’échange MSAA (multi-échantillonnage anticrénelage) ne sont pas directement prises en charge dans le modèle de retournement, de sorte que l’application doit effectuer une résolution MSAA avant d’émettre le présent.

Comment choisir les bonnes résolutions de rendu et de présentation

Le modèle traditionnel pour les applications dans le passé a été de fournir à l’utilisateur une liste de résolutions à choisir lorsque l’utilisateur sélectionne le mode plein écran exclusif. Avec la possibilité des affichages modernes de commencer en toute transparence la mise à l’échelle du contenu, envisagez de fournir aux utilisateurs la possibilité de choisir une résolution de rendu pour la mise à l’échelle des performances, indépendamment d’une résolution de sortie, et même en mode fenêtré. En outre, les applications doivent tirer parti de IDXGIOutput6::CheckHardwareCompositionSupport pour déterminer si elles doivent mettre à l’échelle le contenu avant de le présenter, ou si elles doivent laisser le matériel effectuer la mise à l’échelle pour elles.

Votre contenu devra peut-être être migré d’un GPU à un autre dans le cadre de l’opération actuelle ou de composition. Cela est souvent vrai sur les ordinateurs portables multi-GPU ou les systèmes avec des GPU externes branchés. À mesure que ces configurations deviennent plus courantes et que les affichages haute résolution deviennent de plus en plus courants, le coût de la présentation d’une chaîne d’échange de résolution complète augmente. Si la cible de votre swapchain n’est pas le point principal d’interaction utilisateur, comme c’est souvent le cas avec les titres vr qui présentent un aperçu 2D de la scène VR dans une fenêtre secondaire, envisagez d’utiliser un échange de résolution inférieure pour réduire la quantité de bande passante qui doit être transférée entre différents GPU.

Autres éléments à prendre en compte

La première fois que vous demandez au GPU d’écrire dans la mémoire tampon d’arrière-chaîne d’échange, c’est le moment où le GPU se bloque en attendant que la mémoire tampon soit disponible. Dans la mesure du possible, retardez ce point aussi loin que possible dans le cadre.