Partager via


Surface de composition

Notes

Pour les applications sur Windows 10, nous vous recommandons d’utiliser les API Windows.UI.Composition au lieu de DirectComposition. Pour plus d’informations, consultez Moderniser votre application de bureau à l’aide de la couche visuelle.

Cette rubrique décrit les types de surfaces pris en charge par Microsoft DirectComposition.

Surface logique DirectComposition

DirectComposition expose l’objet IDCompositionSurface pour représenter une surface de composition logique. DirectComposition expose des API que vous pouvez utiliser pour créer, mettre à jour et supprimer ces surfaces logiques. Chaque surface peut être associée à un ou plusieurs visuels. Une application est responsable de la gestion de la durée de vie des surfaces logiques.

Mise à jour d’une surface logique

Une application peut mettre à jour une surface logique en appelant BeginDraw et en spécifiant la taille et le décalage du rectangle sur la surface logique que l’application souhaite mettre à jour. DirectComposition alloue un rectangle de la taille spécifiée, puis retourne la surface et le décalage correspondant dont l’application a besoin pour dessiner ou mettre à jour. Les limites du rectangle de mise à jour sont liées par la taille de la surface. Par exemple, le rectangle de mise à jour d’une surface de 40 x 100 pixels peut atteindre (0,0,40,100). En outre, la région pouvant être mise à jour est appliquée par un rectangle de protection. Étant donné qu’il ne peut y avoir qu’un seul rectangle de garde à la fois, une seule surface logique peut être mise à jour à la fois. BeginDraw retourne un code d’erreur si EndDraw ou SuspendDraw n’a pas été appelé après un appel précédent à BeginDraw. Une application peut ajouter un appel validée à BeginDraw à un lot, mais elle ne prend pas effet tant que EndDraw n’est pas appelé et commité.

Suspension des mises à jour sur une surface logique

Une application qui doit mettre à jour différentes surfaces peut appeler SuspendDraw sur la mise à jour actuelle, puis appeler BeginDraw pour commencer une nouvelle mise à jour. Microsoft DirectComposition autorise plusieurs mises à jour, mais une seule peut être active à la fois. Cela signifie que vous devez appeler SuspendDraw ou EndDraw sur une surface avant d’appeler BeginDraw sur la suivante. Contrairement à EndDraw, un lot validée peut contenir une surface à l’état SuspendDraw , mais ces mises à jour ne s’affichent pas à l’écran tant que EndDraw n’est pas appelé.

Reprise des mises à jour sur une surface logique

Une application peut reprendre une mise à jour d’une surface qui se trouve dans un état SuspendDraw en appelant ResumeDraw. Cette méthode peut être appelée uniquement sur une surface suspendue.

Mettre fin aux mises à jour d’une surface logique

L’appel de EndDraw et Commit est la seule façon de voir les modifications de mise à jour bitmap à l’écran. Chaque appel à EndDraw doit avoir un appel correspondant à BeginDraw pour supprimer le rectangle de protection. La surface logique conserve toutes les mises à jour jusqu’à l’appel de commit . Vous pouvez également appeler EndDraw sur une surface qui se trouve dans l’état SuspendDraw , car EndDraw est une reprise/fin implicite. Après avoir appelé EndDraw, le contenu mis à jour est présenté à l’écran et ignoré afin que la mémoire de la mise à jour puisse être réutilisée pour une mise à jour ultérieure.

Exemple d’utilisation d’une surface logique

L’exemple suivant décrit les étapes qu’une application effectuerait si elle créait une arborescence visuelle composée de deux visuels, puis qu’elle devait mettre à jour des régions spécifiques des deux surfaces logiques associées aux visuels :

  1. Créez un appareil DirectComposition.
  2. Créez l’arborescence visuelle composée d’un nœud racine et des visuels 1 et 2.
  3. Créez des surfaces logiques 1 et 2.
  4. Appelez SetContent pour associer une surface logique aux visuels 1 et 2.
  5. Appelez BeginDraw sur un sous-rectangle de surface logique 1.
  6. Mettez à jour la surface au décalage retourné par DirectComposition.
  7. Étapes facultatives :
    1. Appelez SuspendDraw sur la surface logique 1.
    2. Appelez BeginDraw sur le sous-rect de la surface logique 2.
    3. Mettez à jour la surface au décalage retourné par DirectComposition.
    4. Appelez EndDraw sur la surface logique 2.
    5. Appelez ResumeDraw sur la surface logique 1.
  8. Mettez à jour la surface au décalage retourné par DirectComposition.
  9. Appelez EndDraw sur la surface logique 1.
  10. Call Commit.

Surface virtuelle DirectComposition

DirectComposition expose l’interface IDCompositionVirtualSurface pour représenter une surface virtuelle, qui est une collection de surfaces logiques (vignettes) disposées dans une grille fixe avec des vignettes de taille fixe. L’application spécifie la taille de la texture virtuelle au moment de la création. La taille établit les limites de la surface virtuelle. La surface peut être associée à un ou plusieurs visuels.

Lorsqu’une surface virtuelle est initialisée, elle n’est pas soutenue par des allocations réelles. En d’autres termes, il ne contient pas de bits. DirectComposition alloue des vignettes (c’est-à-dire des objets de surface de composition) après que l’application a commencé à mettre à jour la surface. L’application met à jour la surface virtuelle en appelant BeginDraw et en spécifiant la région d’intérêt par rapport aux coordonnées de la surface virtuelle. Ensuite, DirectComposition alloue les vignettes nécessaires pour contenir la mise à jour et retourne la surface de composition et le décalage à mettre à jour.

Comme pour les surfaces logiques, vous pouvez appeler BeginDraw, SuspendDraw, ResumeDraw et EndDraw sur une surface virtuelle. En outre, DirectComposition expose des méthodes que vous pouvez utiliser pour redimensionner et découper une surface virtuelle existante.

Redimensionnement d’une surface virtuelle

La méthode Resize modifie les limites de la surface virtuelle, ce qui signifie que toutes les nouvelles mises à jour ou allocations doivent se trouver dans les limites définies par la nouvelle taille. Une application utilise Resize pour indiquer à DirectComposition qu’une région particulière de la surface virtuelle n’est plus nécessaire et peut être récupérée. Si Resize réduit la surface virtuelle, l’application ne peut plus mettre à jour les régions en dehors des nouvelles limites.

L’illustration suivante montre une surface virtuelle 3 par 3 redimensionnée à 2 par 2. La région rouge représente les vignettes qui sont ignorées dans le cadre de l’opération de redimensionnement, et la mémoire est récupérée par DirectComposition. Après le redimensionnement, l’application ne peut pas effectuer de mises à jour à la région rouge sans redimensionner à nouveau la surface virtuelle.

redimensionnement d’une surface virtuelle

L’opération de redimensionnement prend effet immédiatement. DirectComposition n’attend pas que l’application appelle Commit pour effectuer les mises à jour de redimensionnement. Par exemple, supposons qu’une application effectue la séquence d’appels suivante.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

Dans cet exemple, l’application perd tout le contenu du premier redimensionnement. Le deuxième redimensionnement n’a aucun effet même s’il a été appelé avant commit. Dans ce cas, rien ne s’affiche à l’écran.

Suppression d’une surface virtuelle

La méthode Trim identifie la région de la surface virtuelle dont l’application a besoin. Il ne redimensionne pas les limites de la surface virtuelle, mais indique à DirectComposition quelles surfaces logiques doivent actuellement être allouées.

Dans l’illustration suivante, le carré vert est la fenêtre d’affichage de l’application. L’application affiche initialement les six premières vignettes (bleues) de la surface virtuelle (gris clair) qui se trouvent dans la fenêtre d’affichage. Lorsque la page représentée par la surface virtuelle défile, l’application doit afficher les six dernières vignettes. L’application appelle Trim pour indiquer que la région définie par les six dernières vignettes est l’emplacement où se trouve le contenu, et que le reste n’est pas nécessaire pour le moment. DirectComposition peut ensuite choisir de recycler les surfaces logiques qui représentaient à l’origine les six premières vignettes (gris foncé).

suppression d’une surface virtuelle

DirectComposition Concepts