Optimisation des performances : graphiques 2D et acquisition d'images

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 Drawing des objets et Shape des objets pour représenter le contenu de dessin graphique. Toutefois, Drawing les objets sont des constructions plus simples que Shape des objets et fournissent de meilleures caractéristiques de performances.

A Shape vous permet de dessiner une forme graphique à l’écran. Étant donné qu’ils sont dérivés de la FrameworkElement classe, Shape les objets peuvent être utilisés à l’intérieur de 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 les 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 Shape classe. Les objets de forme disponibles incluent Ellipse, , LinePolygonPath, , Polyline, et .Rectangle

Drawing les objets, d’autre part, ne dérivent pas de la FrameworkElement classe 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 est utilisé pour restituer le GeometryDrawing contenu geometry. La Geometry classe 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 de découpage. Les objets géométriques peuvent être utilisés pour définir la zone d’un contrôle, par exemple, ou pour définir la zone de détourage à appliquer à une image. Les objets géométriques peuvent être des zones simples, telles que des rectangles et des cercles, ou des zones composites créées à partir d’au moins deux objets géométriques. Des régions géométriques plus complexes peuvent être créées en combinant PathSegmentdes objets dérivés, tels que ArcSegment, BezierSegmentet QuadraticBezierSegment.

Sur la surface, la Geometry classe et la Shape classe sont similaires. Les deux sont utilisés dans le rendu des graphiques 2D et ont tous deux des classes concrètes similaires qui dérivent d’elles, par exemple, EllipseGeometry et Ellipse. Cependant, il existe des différences importantes entre ces deux ensembles de classes. Pour un, la Geometry classe ne dispose pas de certaines fonctionnalités de la Shape classe, telles que 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 que Path est une forme) 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 se trouvent sur la classe qui dessine l’objet geometry, tandis qu’un objet de forme contient ces propriétés. Une façon de penser à cette différence est qu’un objet geometry définit une région, par exemple, un cercle, tandis qu’un objet de forme définit une région, définit la façon dont cette région est remplie et décrite, et participe au système de disposition.

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

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

Objets StreamGeometry

L’objet StreamGeometry est une alternative légère à la création de PathGeometry formes géométriques. Utilisez un StreamGeometry moment où vous devez décrire une géométrie complexe. StreamGeometry est optimisé pour la gestion de nombreux PathGeometry objets et fonctionne mieux par rapport à l’utilisation de nombreux objets individuels PathGeometry .

L’exemple suivant utilise la syntaxe d’attribut pour créer un triangle StreamGeometry 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 StreamGeometry objets, 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 dite légère, car elle n’assure pas la gestion des dispositions ni des événements, ce qui améliore ses performances. C’est pour cette raison que 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.

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

  • Si votre application vous impose d’afficher des images miniatures, envisagez de créer une version de taille 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éduirez non seulement la plage de travail de votre application, mais son exécution sera également plus rapide.

  • Si possible, combinez plusieurs images pour en faire une seule, comme une bande de film composée de plusieurs images.

  • Pour plus d’informations, consultez Vue d’ensemble de la création d’images.

BitmapScalingMode

Lors de l’animation de l’échelle de n’importe quelle bitmap, l’algorithme de rééchantillage d’image de haute qualité par défaut peut parfois consommer suffisamment de ressources système pour provoquer une dégradation de la fréquence d’images, ce qui provoque efficacement l’étourdissement des animations. En définissant la propriété de l’objet LowQualitysur , vous pouvez créer une animation plus fluide lors de la mise à l’échelle BitmapScalingModeRenderOptions d’une bitmap. LowQuality Le 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’objet BitmapScalingMode 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 TileBrush objets, tels que DrawingBrush et VisualBrush. Dans les scénarios statiques où le contenu ou l’utilisation de la TileBrush 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 contenu statique est utilisé de manière non statique, par exemple lorsqu’un objet statique DrawingBrush ou VisualBrush est mappé à la surface d’un objet 3D pivotant. Le comportement par défaut de WPF consiste à réexécituer l’intégralité du contenu de l’image DrawingBrush ou VisualBrush pour chaque image, même si le contenu n’est pas immuable.

En définissant la CachingHint propriété de l’objet CacheRenderOptions sur , vous pouvez augmenter les performances à l’aide de versions mises en cache des objets pinceau mosaïques.

Les CacheInvalidationThresholdMinimum valeurs et CacheInvalidationThresholdMaximum valeurs de propriété sont des valeurs de taille relative qui déterminent quand l’objet doit être régénéré en raison des modifications apportées à l’échelle TileBrush . Par exemple, en définissant la CacheInvalidationThresholdMaximum propriété sur 2.0, le cache pour le TileBrush seul doit ê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