Optimiser les performances 3D de WPF

Lorsque vous utilisez Windows Presentation Foundation (WPF) pour générer des contrôles 3D et inclure des scènes 3D dans vos applications, il est important de prendre en compte l’optimisation des performances. Cette rubrique fournit une liste de classes et de propriétés 3D qui ont des implications sur les performances pour votre application, ainsi que des recommandations pour optimiser les performances lorsque vous les utilisez.

Cette rubrique suppose une compréhension avancée des fonctionnalités 3D de Windows Presentation Foundation (WPF). Les suggestions de ce document s’appliquent au « niveau de rendu 2 », à peu près défini comme matériel prenant en charge le nuanceur de pixels version 2.0 et le nuanceur de vertex version 2.0. Pour plus d’informations, consultez Les niveaux de rendu graphique.

Impact sur les performances : élevé

Propriété Recommandation
Brush Vitesse du pinceau (la plus rapide à la plus lente) :

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (mis en cache)

VisualBrush (mis en cache)

RadialGradientBrush

DrawingBrush (non mis en cache)

VisualBrush (non mis en cache)
ClipToBoundsProperty Définissez Viewport3D.ClipToBounds la valeur false chaque fois que vous n’avez pas besoin de faire en sorte que Windows Presentation Foundation (WPF) découpe explicitement le contenu d’un Viewport3D dans le rectangle de Viewport3D. La capture antialiased windows Presentation Foundation (WPF) peut être très lente et ClipToBounds est activée (lente) par défaut sur Viewport3D.
IsHitTestVisible Définissez Viewport3D.IsHitTestVisible la valeur false chaque fois que vous n’avez pas besoin de Windows Presentation Foundation (WPF) pour prendre en compte le contenu d’un Viewport3D test d’accès à la souris. Le test de positionnement du contenu 3D est effectué dans les logiciels et peut être lent avec des maillages volumineux. IsHitTestVisible est activé (lent) par défaut sur Viewport3D.
GeometryModel3D Créez des modèles différents uniquement lorsqu’ils nécessitent différents matériaux ou transformations. Sinon, essayez de fusionner de nombreuses GeometryModel3D instances avec les mêmes matériaux et transformations en quelques grandes GeometryModel3D instances.MeshGeometry3D
MeshGeometry3D L’animation de maillage ( modification des sommets individuels d’un maillage par image) n’est pas toujours efficace dans Windows Presentation Foundation (WPF). Pour réduire l’impact sur les performances des notifications de modification lorsque chaque vertex est modifié, détachez le maillage de l’arborescence visuelle avant d’effectuer une modification par vertex. Une fois que le maillage a été modifié, rattachez-le à l’arborescence visuelle. En outre, essayez de réduire la taille des maillages qui seront animés de cette façon.
Antialiasing 3D Pour augmenter la vitesse de rendu, désactivez l’échantillonnage multiple sur un Viewport3D en définissant la propriété EdgeMode jointe sur Aliased. Par défaut, l’anticrénelage 3D est activé sur Windows avec 4 exemples par pixel.
Texte Le texte en direct dans une scène 3D (en direct, car il se trouve dans un DrawingBrush ou VisualBrush) peut être lent. Essayez d’utiliser des images du texte à la place (via RenderTargetBitmap) sauf si le texte change.
TileBrush Si vous devez utiliser une scène 3D ou une VisualBrushDrawingBrush dans une scène 3D, car le contenu du pinceau n’est pas statique, essayez de mettre en cache le pinceau (en définissant la propriété CachingHint jointe sur Cache). Définissez les seuils d’invalidation de mise à l’échelle minimale et maximale (avec les propriétés CacheInvalidationThresholdMinimum jointes et CacheInvalidationThresholdMaximum) afin que les pinceaux mis en cache ne soient pas régénérés trop fréquemment, tout en conservant le niveau de qualité souhaité. Par défaut, DrawingBrush et VisualBrush ne sont pas mis en cache, ce qui signifie que chaque fois que quelque chose peint avec le pinceau doit être recréé, tout le contenu du pinceau doit d’abord être recréé dans une surface intermédiaire.
BitmapEffect BitmapEffect force tout le contenu affecté à être rendu sans accélération matérielle. Pour de meilleures performances, n’utilisez BitmapEffectpas .

Impact sur les performances : moyen

Propriété Recommandation
MeshGeometry3D Lorsqu’un maillage est défini comme des triangles avec des sommets partagés et que ces sommets ont la même position, la normale et les coordonnées de texture, définissez chaque sommet partagé une seule fois, puis définissez vos triangles par index avec TriangleIndices.
ImageBrush Essayez de réduire les tailles de texture lorsque vous avez un contrôle explicite sur la taille (lorsque vous utilisez un RenderTargetBitmap et/ou un ImageBrush). Notez que les textures de résolution inférieure peuvent diminuer la qualité visuelle. Essayez donc de trouver le bon équilibre entre la qualité et les performances.
Opacity Lors du rendu du contenu 3D translucide (comme les réflexions), utilisez les propriétés d’opacité sur les pinceaux ou les matériaux (via Opacity ou Color) au lieu de créer un translucide Viewport3D distinct en définissant Viewport3D.Opacity sur une valeur inférieure à 1.
Viewport3D Réduisez le nombre d’objets Viewport3D que vous utilisez dans une scène. Placez de nombreux modèles 3D dans le même Viewport3D plutôt que de créer des instances Viewport3D distinctes pour chaque modèle.
Freezable En règle générale, il est utile de réutiliser MeshGeometry3D, GeometryModel3Dpinceaux et matériaux. Tous sont multiparentables, car ils sont dérivés de Freezable.
Freezable Appelez la Freeze méthode sur Freezables quand leurs propriétés restent inchangées dans votre application. La congélation peut diminuer le jeu de travail et augmenter la vitesse.
Brush Utilisez ImageBrush plutôt VisualBrush que DrawingBrush lorsque le contenu du pinceau ne changera pas. Le contenu 2D peut être converti en un Image via RenderTargetBitmap , puis utilisé dans un ImageBrush.
BackMaterial N’utilisez BackMaterial pas à moins que vous n’ayez réellement besoin de voir les visages arrière de votre GeometryModel3D.
Light Vitesse légère (la plus rapide à la plus lente) :

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Essayez de conserver les tailles de maillage sous ces limites :

Positions: 20 001 Point3D instances

TriangleIndices: 60 003 Int32 instances
Material Vitesse matérielle (la plus rapide à la plus lente) :

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D n’exclut pas les pinceaux invisibles (pinceaux ambiants noirs, pinceaux clairs, etc.) de manière cohérente. Envisagez d’omettre ces éléments de votre scène.
MaterialGroup Chacun Material dans une MaterialGroup autre passe de rendu, ainsi, y compris de nombreux matériaux, même des matériaux simples, peut considérablement augmenter les demandes de remplissage sur votre GPU. Réduisez le nombre de matériaux dans votre MaterialGroup.

Impact sur les performances : faible

Propriété Recommandation
Transform3DGroup Lorsque vous n’avez pas besoin d’animation ou de liaison de données, au lieu d’utiliser un groupe de transformations contenant plusieurs transformations, utilisez un seul MatrixTransform3D, en le définissant comme le produit de toutes les transformations qui existent autrement indépendamment dans le groupe de transformations.
Light Réduisez le nombre de lumières dans votre scène. Trop de lumières dans une scène forceront Windows Presentation Foundation (WPF) à revenir au rendu logiciel. Les limites sont d’environ 110 DirectionalLight objets, 70 PointLight objets ou 40 SpotLight objets.
ModelVisual3D Séparez le déplacement d’objets à partir d’objets statiques en les plaçant dans des instances distinctes ModelVisual3D . ModelVisual3D est « plus lourd » que parce qu’il GeometryModel3D met en cache les limites transformées. GeometryModel3D est optimisé pour être un modèle ; ModelVisual3D est optimisé pour être un nœud de scène. Utilisez ModelVisual3D pour placer des instances partagées de GeometryModel3D dans la scène.
Light Réduisez le nombre de fois où vous modifiez le nombre de lumières dans la scène. Chaque changement de nombre de lumière force une régénération et une recompilation du nuanceur, sauf si cette configuration existe précédemment (et a donc eu son nuanceur mis en cache).
Léger Les lumières noires ne seront pas visibles, mais elles ajouteront du temps de rendu ; pensez à les omettre.
MeshGeometry3D Pour réduire le temps de construction des grandes collections dans Windows Presentation Foundation (WPF), telles qu’un MeshGeometry3D, PositionsNormalsTextureCoordinateset TriangleIndicesprédimensionner les collections avant la population des valeurs. Si possible, transmettez les constructeurs des collections préremplies de structures de données telles que des tableaux ou des listes.

Voir aussi