Optimisation des performances : graphismes et imagerie 2D

WPF fournit une large gamme de fonctionnalités graphiques et d’imagerie 2D qui peuvent être optimisées pour vos besoins en matière d’application. Cette rubrique fournit des informations sur l’optimisation des performances dans ces domaines.

Dessin et formes

WPF fournit à la fois des objets Drawing et Shape pour représenter le contenu graphique du dessin. Toutefois, Drawing objets sont des constructions plus simples que des objets Shape et fournissent de meilleures caractéristiques de performances.

Un Shape vous permet de dessiner une forme graphique à l’écran. Étant donné qu’ils sont dérivés de la classe FrameworkElement, Shape objets peuvent être utilisés dans des panneaux et la plupart des contrôles.

WPF offre plusieurs couches d’accès aux services graphiques et de rendu. Au niveau de la couche supérieure, Shape objets sont faciles à utiliser et fournissent de nombreuses fonctionnalités utiles, telles que la disposition et la gestion des événements. WPF fournit un certain nombre d’objets de forme prêts à l’emploi. Tous les objets de forme héritent de la classe Shape. Les objets de forme disponibles incluent Ellipse, Line, Path, Polygon, Polylineet Rectangle.

Drawing objets, d’autre part, ne dérivent pas de la classe FrameworkElement et fournissent une implémentation plus légère pour le rendu des formes, des images et du texte.

Il existe quatre types d’objets Drawing :

L’objet GeometryDrawing est utilisé pour afficher le contenu géométrique. La classe Geometry et les classes concrètes qui en dérivent, telles que CombinedGeometry, EllipseGeometryet PathGeometry, fournissent un moyen de restituer des graphiques 2D et de fournir une prise en charge des tests de positionnement et des découpages. Les objets Geometry peuvent être utilisés pour définir la région d’un contrôle, par exemple, ou pour définir la zone clip à appliquer à une image. Les objets geometry peuvent être des régions simples, telles que des rectangles et des cercles, ou des régions composites créées à partir de deux objets geometry ou plus. Des régions géométriques plus complexes peuvent être créées en combinant des objets dérivés de PathSegment, tels que ArcSegment, BezierSegmentet QuadraticBezierSegment.

Sur la surface, la classe Geometry et la classe Shape sont similaires. Les deux sont utilisés dans le rendu de graphiques 2D et ont tous deux des classes concrètes similaires qui dérivent d’elles, par exemple, EllipseGeometry et Ellipse. Toutefois, il existe des différences importantes entre ces deux ensembles de classes. Pour un, la classe Geometry n’a pas certaines fonctionnalités de la classe Shape, comme la possibilité de se dessiner elle-même. Pour dessiner un objet géométrique, une autre classe telle que DrawingContext, Drawing ou Path (il est important de noter qu'un Path est une forme géométrique) doit être utilisée pour effectuer l’opération de dessin. Les propriétés de rendu, telles que le remplissage, le trait et l'épaisseur du trait, sont associées à la classe qui dessine l'objet géométrique, tandis qu'un objet de forme intègre ces propriétés. Une façon de penser à cette différence est qu'un objet géométrique définit une région, par exemple, un cercle, tandis qu'une forme définit une région, détermine la façon dont cette région est remplie et délimitée, et participe au système d'agencement.

Étant donné que Shape objets dérivent de la classe FrameworkElement, l’utilisation de ces objets peut ajouter beaucoup plus de consommation de mémoire dans votre application. Si vous n’avez vraiment pas besoin des fonctionnalités de FrameworkElement pour votre contenu graphique, envisagez d’utiliser les objets Drawing plus légers.

Pour plus d’informations sur les objets Drawing, consultez Vue d’ensemble des objets de dessin.

Objets StreamGeometry

L’objet StreamGeometry est une alternative légère à PathGeometry pour créer des formes géométriques. Utilisez un StreamGeometry lorsque vous devez décrire une géométrie complexe. StreamGeometry est optimisé pour la gestion de nombreux objets PathGeometry et fonctionne mieux en comparaison avec l’utilisation de nombreux objets PathGeometry individuels.

L’exemple suivant utilise la syntaxe d’attribut pour créer une StreamGeometry triangulaire en XAML.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>
  
    <Path Data="F0 M10,100 L100,100 100,50Z" 
      StrokeThickness="1" Stroke="Black"/>

  </StackPanel>
</Page>

Pour plus d’informations sur les objets StreamGeometry, consultez Créer une forme à l’aide d’un StreamGeometry.

Objets DrawingVisual

L’objet DrawingVisual est une classe de dessin légère utilisée pour afficher des formes, des images ou du texte. Cette classe est considérée comme légère, car elle ne fournit pas de disposition ou de gestion des événements, ce qui améliore ses performances. Pour cette raison, les dessins sont idéaux pour les arrière-plans et les images clipart. Pour plus d’informations, consultez Utilisation d’objets DrawingVisual.

Images

L’imagerie WPF offre une amélioration significative des fonctionnalités d’imagerie dans les versions précédentes de Windows. Les fonctionnalités d’imagerie, telles que l’affichage d’une bitmap ou l’utilisation d’une image sur un contrôle commun, étaient principalement gérées par l’interface GDI (Microsoft Windows Graphics Device Interface) ou l’interface de programmation d’applications (API) Microsoft Windows GDI+. Ces API ont fourni des fonctionnalités d’imagerie de référence, mais elles n’ont pas pris en charge les fonctionnalités telles que la prise en charge de l’extensibilité des codecs et la prise en charge des images haute fidélité. Les API WPF Imaging ont été repensées pour surmonter les lacunes de GDI et GDI+ et fournir un nouvel ensemble d’API pour afficher et utiliser des images au sein de vos applications.

Lorsque vous utilisez des images, tenez compte des recommandations suivantes pour obtenir de meilleures performances :

  • Si votre application vous oblige à afficher des images miniatures, envisagez de créer une version réduite de l’image. Par défaut, WPF charge votre image et la décode en sa taille complète. Si vous ne souhaitez qu’une version miniature de l’image, WPF décode inutilement l’image en sa taille complète, puis la met à l’échelle jusqu’à une taille miniature. Pour éviter cette surcharge inutile, vous pouvez demander à WPF de décoder l’image à une taille de miniature, ou demander à WPF de charger une image de taille de miniature.

  • Décodez toujours l’image à la taille souhaitée et non à la taille par défaut. Comme mentionné ci-dessus, demandez à WPF de décoder votre image à une taille souhaitée et non à la taille complète par défaut. Vous réduisez non seulement l’ensemble de travail de votre application, mais également la vitesse d’exécution.

  • Si possible, combinez les images en une seule image, telle qu’une bande de films composée de plusieurs images.

  • Pour plus d’informations, consultez Vue d’ensemble de l’imagerie.

BitmapScalingMode

Lors de l’animation de l'échelle d'une bitmap, l'algorithme de rééchantillonnage d'image de haute qualité par défaut peut parfois consommer suffisamment de ressources système pour entraîner une dégradation de la fréquence d'images, ce qui provoque effectivement des saccades dans les animations. En définissant la propriété BitmapScalingMode de l’objet RenderOptions sur LowQuality, vous pouvez créer une animation plus fluide lors de la mise à l’échelle d’une bitmap. LowQuality mode indique au moteur de rendu WPF de passer d’un algorithme optimisé de qualité à un algorithme optimisé pour la vitesse lors du traitement des images.

L’exemple suivant montre comment définir l'BitmapScalingMode d’un objet image.

// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)

CachingHint

Par défaut, WPF ne met pas en cache le contenu rendu des objets TileBrush, tels que DrawingBrush et VisualBrush. Dans les scénarios statiques où le contenu ou l’utilisation de l'TileBrush dans la scène ne changent pas, cela est logique, car il conserve la mémoire vidéo. Il n’est pas aussi judicieux lorsqu’un TileBrush avec du contenu statique est utilisé de manière non statique, par exemple lorsqu’un DrawingBrush statique ou VisualBrush est mappé à la surface d’un objet 3D pivotant. Le comportement par défaut de WPF consiste à rendre à nouveau l'intégralité du contenu de la DrawingBrush ou VisualBrush pour chaque image, même si le contenu ne change pas.

En configurant la propriété CachingHint de l’objet RenderOptions sur Cache, vous pouvez améliorer les performances en utilisant des versions mises en cache des objets de pinceau en mosaïque.

Les valeurs de propriété CacheInvalidationThresholdMinimum et CacheInvalidationThresholdMaximum sont des valeurs de taille relative qui déterminent quand l’objet TileBrush doit être régénéré en raison des modifications apportées à l’échelle. Par exemple, en définissant la propriété CacheInvalidationThresholdMaximum sur 2.0, le cache de l'TileBrush doit uniquement être régénéré lorsque sa taille dépasse deux fois la taille du cache actuel.

L’exemple suivant montre comment utiliser l’option d’indicateur de mise en cache pour un DrawingBrush.

DrawingBrush drawingBrush = new DrawingBrush();

// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);

// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()

' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)

' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)

Voir aussi