Optimisation des performances : graphiques 2D et acquisition d'images
WPF fournit une large gamme de fonctionnalités graphiques 2D et d'acquisition d'images qui peuvent être optimisées pour répondre aux spécifications de votre application. Cette rubrique fournit des informations sur l'optimisation des performances dans ces domaines.
Cette rubrique comprend les sections suivantes.
- Dessin et formes
- Objets StreamGeometry
- Objets DrawingVisual
- Images
- Rubriques connexes
Dessin et formes
WPF fournit les objets Drawing et Shape pour représenter du contenu graphique dessiné. Cependant, les objets Drawing sont des constructions plus simples que les objets Shape et présentent de meilleures caractéristiques de performances.
Shape vous permet de dessiner une forme graphique à l'écran. Puisqu'ils sont dérivés de la classe FrameworkElement, les objets Shape peuvent être utilisés à l'intérieur des panneaux et de 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, les objets, Shape sont faciles à utiliser et offrent de nombreuses fonctionnalités utiles, telles que la disposition et la gestion d'événements. WPF fournit plusieurs objets de forme prêts à l'emploi. Tous les objets de forme héritent de la classe Shape. Parmi les objets de forme disponibles figurent Ellipse, Line, Path, Polygon, Polyline et Rectangle.
Les objets Drawing, en revanche, ne dérivent pas de la classe FrameworkElement et fournissent une implémentation allégée du rendu des formes, des images et du texte.
Il existe quatre types d'objets Drawing :
GeometryDrawing Dessine une forme.
ImageDrawing Dessine une image.
GlyphRunDrawing Dessine du texte.
DrawingGroup Dessine d'autres dessins. Utilisez un groupe de dessins pour combiner d'autres dessins en un seul dessin composite.
L'objet GeometryDrawing est utilisé pour afficher du contenu géométrique. La classe Geometry et les classes concrètes qui en dérivent, telles que CombinedGeometry, EllipseGeometry et PathGeometry, fournissent une solution pour le rendu des graphiques 2D ainsi que la prise en charge des tests d'atteinte et du détourage. 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 constituer 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. Il est possible de créer des zones géométriques plus complexes en combinant des objets dérivés de PathSegment, tels que ArcSegment, BezierSegment et QuadraticBezierSegment.
En apparence, les classes Geometry et Shape sont assez semblables. Elles sont toutes deux utilisées pour le rendu des graphiques 2D et elles ont toutes deux des classes concrètes semblables qui dérivent d'elles, par exemple EllipseGeometry et Ellipse. Toutefois, il existe des différences importantes entre ces deux ensembles de classes. À l'une d'elles, la classe Geometry, il manque une partie des fonctionnalités de la classe Shape, telle que la possibilité de 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 sont dans la classe qui dessine l'objet géométrique, puisqu'un objet de forme contient ces propriétés. Une façon de se représenter à l'esprit cette différence est de considérer qu'un objet géométrique définit une zone, par exemple un cercle, tandis qu'un objet de forme définit une zone, définit son remplissage et son contour, et participe au système de disposition.
Puisque les objets Shape dérivent de la classe FrameworkElement, leur utilisation peut engendrer une plus grande consommation de mémoire de votre application. Si vous n'avez réellement pas besoin des fonctionnalités de FrameworkElement pour votre contenu graphique, envisagez l'utilisation des objets Drawing allégés.
Pour plus d'informations sur les objets Drawing, consultez Vue d'ensemble des objets Drawing.
Objets StreamGeometry
L'objet StreamGeometry est une alternative légère à PathGeometry pour la création de formes géométriques. Utilisez StreamGeometry lorsque vous avez besoin de décrire une géométrie complexe. StreamGeometry est optimisé pour gérer de nombreux objets PathGeometry et fonctionne mieux en comparaison à l'utilisation de nombreux objets PathGeometry individuels.
L'exemple suivant utilise la syntaxe d'attribut pour créer un StreamGeometry triangulaire en XAML.
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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 Comment : 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 le rendu des formes, des images ou du texte. Cette classe est considérée comme légère parce qu'elle ne fournit pas la disposition ou la gestion d'événements, ce qui améliore ses performances. Pour cette raison, les objets de ce type sont idéaux pour les arrière-plans et les images clipart. Pour plus d'informations, consultez Utilisation d'objets DrawingVisual.
Images
L'acquisition d'images de WPF apporte une amélioration importante par rapport aux fonctionnalités des images des versions précédentes de Windows. Les fonctionnalités liées aux images, telles que l'affichage de bitmap ou l'utilisation d'une image sur un contrôle commun, étaient principalement prises en charge par l'interface de programmation d'application (API) Microsoft Windows Graphics Device Interface (GDI) ou Microsoft Windows GDI+. Ces API proposaient des fonctionnalités de base pour la création d'images, mais étaient dépourvues de fonctionnalités telles que la prise en charge de l'extensibilité de codec et des images haute fidélité. Les API de création d'images de WPF ont été refondues pour résoudre les problèmes de GDI et GDI+, et fournissent un nouvel ensemble d'API pour afficher et utiliser des images dans vos applications.
Lorsque vous utilisez des images, tenez compte des recommandations suivantes pour obtenir de meilleures performances :
Si votre application requiert l'affichage d'images miniatures, envisagez la création d'une version de taille réduite de l'image. Par défaut, WPF charge votre image et la décode dans sa taille maximale. Si vous voulez seulement une version miniature de l'image, WPF décode inutilement l'image dans sa taille maximale et la réduit ensuite à sa taille miniature. Afin d'éviter ce traitement inutile, vous pouvez soit demander à WPF de décoder l'image en taille miniature, soit demander à WPF de charger une image de taille miniature.
Décodez toujours l'image dans la taille désirée et non pas dans la taille par défaut. Comme mentionné ci-dessus, demandez à WPF de décoder votre image dans la taille désirée et non pas dans la taille par défaut. Vous réduirez non seulement le jeu de travail de votre application, mais son exécution sera également plus rapide.
Si possible, combinez les images en une seule image, comme un extrait de film composé 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 d'une bitmap, l'algorithme de rééchantillonnage d'image haute qualité par défaut peut parfois consommer assez de ressources système pour provoquer une dégradation de la fréquence d'images, causant en pratique l'interruption des animations. En affectant à la propriété BitmapScalingMode de l'objet RenderOptions la valeur LowQuality, vous pouvez créer une animation plus lisse lors de la mise à l'échelle d'une bitmap. Le mode LowQuality indique au moteur de rendu WPF de basculer d'un algorithme optimisé pour la qualité à un algorithme optimisé pour la vitesse lorsqu'il traite des images.
L'exemple suivant indique comment définir le 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ù ni le contenu ni l'utilisation du TileBrush dans la scène ne changent, cela a du sens, puisqu'il conserve la mémoire vidéo. Cela a moins de sens lorsqu'un TileBrush avec du contenu statique est utilisé de façon non-statique ; par exemple lorsqu'un DrawingBrush ou VisualBrush statique est mappé à la surface d'un objet 3D pivotant. Le comportement par défaut de WPF est de restituer à nouveau le contenu entier du DrawingBrush ou du VisualBrush pour chaque trame, même si le contenu est invariable.
En définissant la propriété CachingHint de l'objet RenderOptions à Cache, vous pouvez augmenter 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 le moment où l'objet TileBrush doit être régénéré en raison de modifications dans l'échelle. Par exemple, en affectant la valeur 2.0 à la propriété CacheInvalidationThresholdMaximum, le cache pour TileBrush n'a besoin d'être régénéré que lorsque sa taille dépasse deux fois la taille du cache actuel.
L'exemple suivant montre comment utiliser l'option d'optimisation de mise en cache pour un DrawingBrush.
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)
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);
Voir aussi
Concepts
Optimisation des performances des applications WPF
Planification des performances des applications
Optimisation des performances : tirer parti du matériel
Optimisation des performances : disposition et conception
Optimisation des performances : comportement d'objets
Optimisation des performances : ressources d'application
Optimisation des performances : texte
Optimisation des performances : liaison de données