Partager via


Pour des performances optimales, utilisez le modèle de retournement DXGI

Cette rubrique fournit des conseils pour les développeurs sur la façon d’optimiser les performances et l’efficacité de la pile de présentations sur les versions modernes de Windows. Il récupère l’emplacement où modèle de retournement DXGI, DirectX 12 : Modes de présentation dans windows 10 (vidéo)et Améliorations de présentation dans Windows 10 : Une vidéo (préversion) désactivée.

Appel à l’action

Si vous utilisez toujours DXGI_SWAP_EFFECT_DISCARD ou DXGI_SWAP_EFFECT_SEQUENTIAL (a.k.a. le modèle actuel « blt »), il est temps de s’arrêter !

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

Le modèle de retournement présente jusqu’à rendre le mode fenêtré efficacement équivalent ou mieux en comparaison avec le mode classique « plein écran exclusif ». 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 inversé incluent plus rapidement Alt-Tab basculement et une meilleure intégration avec les fonctionnalités d’affichage modernes.

Pourquoi maintenant ? Avant la mise à jour d’avril 2018, le modèle blt présente peut entraîner une déchirure visible lorsqu’il est utilisé sur des configurations GPU hybrides, souvent trouvés 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 coût d’un travail supplémentaire. 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 blt au modèle actuel de retournement. En outre, envisagez de réduire la résolution de votre chaîne d’échange, en particulier si ce n’est pas le point principal d’interaction utilisateur (comme c’est souvent le cas avec les fenêtres vr preview).

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 de D3D était de « blt » ou de la copier dans une surface appartenant à la fenêtre ou à l’écran. À compter de l’effet d’échange FLIPEX de D3D9 et de LXGI via l’effet d’échange FLIP_SEQUENTIAL dans Windows 8, nous avons développé un moyen plus efficace de mettre le contenu à l’écran en le partageant directement avec le compositeur de bureau, avec des copies minimales. Consultez modèle de retournement DXGI pour obtenir une vue d’ensemble générale de la technologie.

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 produisant du contenu, que toutes les couches ensemble dans le même HWND, sur une base actuelle. Par exemple, d’utiliser D3D pour dessiner un arrière-plan de fenêtre, puis Windows GDI pour dessiner quelque chose en haut, ou à l’aide de deux API graphiques différentes, ou deux chaînes d’échange de la même API, pour produire des images alternées. Si vous n’avez pas besoin de HWND-level interop entre les composants graphiques, vous n’avez pas besoin de modèle blt.

Il existe un deuxième élément de fonctionnalité qui n’a pas été fourni dans la conception de modèle de retournement d’origine, mais qui est maintenant disponible, qui est la possibilité de présenter à un framerate non dérotté. Pour une application utilisant l’intervalle de synchronisation 0, nous vous déconseillons de basculer vers le modèle, sauf si l’API IDXGIFactory5 ::CheckFeatureSupport est disponible, et la prise en charge des rapports pour 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 de « Flip indépendant ». Il s’agit d’optimisations activées pour les applications à l’aide de chaînes d’échange de modèle de retournement. 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 images d’application à l’écran, de la même façon que l’écran plein écran exclusif.

Ces jours-ci, ces optimisations peuvent s’engager dans l’un des 3 scénarios, afin d’augmenter les 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 pour s’afficher à l’écran, la chaîne d’échange d’application est utilisée.
  2. DirectFlip avec des appareils de panneau: votre région cliente 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 d’analyse GPU est utilisé pour mettre à l’échelle votre mémoire tampon tout en l’envoyant à 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 d’analyse matériel dédié pour votre application, qui est ensuite analysé et potentiellement étendu à une sous-région alpha-fusionnée 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 de IDXGIOutput6 ::CheckHardwareCompositionSupport. Une mise en garde à garder à l’esprit est que si les appareils de panneau sont utilisés, il est possible que le curseur souffre d’effets secondaires étirés, ce qui est indiqué via DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.

Une fois que votre chaîne d’échange a été « DirectFlipped », le DWM peut aller en veille et se réveiller uniquement quand quelque chose change en dehors de votre application. Vos images d’application sont envoyées directement à l’écran, indépendamment, avec la même efficacité que l’écran plein écran exclusif. Il s’agit de « Flip indépendant » et peut s’engager dans tous les scénarios ci-dessus. Si d’autres contenus de bureau viennent en haut, le DWM peut soit effectuer une transition transparente vers le mode composé, efficacement « inverser la composition » du contenu au-dessus de l’application avant de le glisser, soit tirer parti du MPO pour maintenir le mode flip indépendant.

Consultez l’outil PresentMon pour obtenir des informations sur l’utilisation ci-dessus.

Qu’est-ce que d’autres nouveautés dans le 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 de retournement à utiliser :

  • Diminution de la latence à l’aide de DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. En mode Retour indépendant, vous pouvez passer à 1 trame de latence sur les versions récentes de Windows, avec une secours appropriée au minimum possible lorsqu’elle est composée.
    • Mise en garde : il y a eu un problème qui a donné au moins deux images de latence dans la mise à jour anniversaire Windows 10 et les versions antérieures. Consultez cette rubrique de forum pour plus d’informations. Cette opération est corrigée dans la mise à jour de Fall Creator.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD permet un mode de « composition inversée » de retournement direct, ce qui entraîne un travail moins global pour afficher le bureau. Le DWM peut scribbler sur les mémoires tampons de l’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 peut activer une latence encore plus faible que l’objet pouvant être attendu, même dans une fenêtre sur les systèmes avec une prise en charge de 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 dans les formats HDR (R10G10B10A2_UNORM ou R16G16B16A16_FLOAT) n’est pas limité, sauf s’il est composé à un bureau SDR.
  • Les statistiques actuelles sont disponibles en mode fenêtré.
  • Il existe une plus grande compatibilité avec le modèle d’application UWP (plateforme Windows universelle) et DX12, car ceux-ci sont uniquement compatibles avec le modèle inversé.

Que dois-je faire pour utiliser le modèle flip ?

Les chaînes d’échange de modèle de retournement ont quelques exigences supplémentaires en plus des chaînes d’échange blt :

  1. Le nombre de mémoires tampons doit être d’au moins 2.
  2. Après Présenter appels, la mémoire tampon de retour doit être explicitement 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 Présent.
  4. Les chaînes d’échange MSAA (anti-aliasing multisample) ne sont pas directement prises en charge dans le modèle de retournement. L’application doit donc effectuer une résolution MSAA avant d’émettre le Present.

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é d’affichages modernes pour commencer de manière transparente 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 s’ils doivent mettre à l’échelle le contenu avant de le présenter, ou s’ils doivent laisser le matériel effectuer la mise à l’échelle pour eux.

Votre contenu peut avoir besoin d’être migré d’un GPU vers 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 sont plus courantes et que les affichages à haute résolution deviennent 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 chaîne d’échange 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 une chaîne d’échange de résolution inférieure pour réduire la quantité de bande passante qui doit être transférée sur différentes GPU.

Autres considérations

La première fois que vous demandez au GPU d’écrire dans la mémoire tampon de la chaîne d’échange, c’est le moment où le GPU bloque l’attente de la mise à disposition de la mémoire tampon. Dans la mesure du possible, retardez ce point dans le cadre le plus possible.