Optimiser les performances 3D de WPF

À mesure que 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 conséquences de performance pour votre application, avec les recommandations pour l'optimisation des performances lorsque vous les utilisez.

Cette rubrique suppose une connaissance avancée des fonctionnalités 3D de Windows Presentation Foundation (WPF). Les suggestions dans ce document s'appliquent à la "couche de rendu 2", approximativement définie comme le matériel prenant en charge Pixel Shader version 2.0 et Vertex Shader version 2.0. Pour plus d'informations, consultez Couches de rendu graphiques.

Impact sur les performances : élevé

Propriété

Recommandation

Brush

Vitesse du pinceau (de 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

Attribuez la valeur False à Viewport3D.ClipToBounds lorsque vous n'avez pas besoin que Windows Presentation Foundation (WPF) découpe explicitement le contenu d'un Viewport3D sur le rectangle du Viewport3D. Le découpage Windows Presentation Foundation (WPF) anticrénelage peut s'avérer très lent, et ClipToBounds est activé (lentement) par défaut sur Viewport3D.

IsHitTestVisible

Affectez la valeur false à Viewport3D.IsHitTestVisible à chaque fois que vous n'avez pas besoin de Windows Presentation Foundation (WPF) pour prendre en compte le contenu d'un Viewport3D lors de la réalisation d'un test d'atteinte de souris.  Le contenu 3D du test d'atteinte est effectué dans le logiciel et peut s'avérer lent avec de grands maillages. IsHitTestVisible est activé (lentement) par défaut sur Viewport3D.

GeometryModel3D

Créez des modèles différents uniquement lorsqu'ils ont besoin de matériaux ou transformations différents. Sinon, essayez de fusionner de nombreuses instances GeometryModel3D avec les mêmes matériaux et transformations dans quelques GeometryModel3D et instances MeshGeometry3D plus grandes.

MeshGeometry3D

L'animation du maillage, modifiant chaque vertex d'un maillage sur une base image par image, n'est pas toujours efficace dans Windows Presentation Foundation (WPF). Pour réduire l'impact sur les performances des notifications de modifications lorsque chaque vertex est modifié, détachez le maillage de l'arborescence d'éléments visuels avant d'effectuer la modification par vertex.  Une fois le maillage modifié, rattachez-le à l'arborescence d'éléments visuels.  En outre, essayez de réduire la taille des maillages qui seront animés de cette façon.

Anticrénelage 3D

Pour augmenter la vitesse de rendu, désactivez l'échantillonnage multiple sur un Viewport3D en affectant à la propriété attachée EdgeMode la valeur Aliased. Par défaut, l'anticrénelage 3D est désactivé sur Microsoft Windows XP et activé sur Windows Vista avec 4 exemples par pixel.

Texte

Le texte vivant dans une scène 3D (vivant car il se trouve dans un DrawingBrush ou VisualBrush) peut s'avérer lent. Essayez d'utiliser à la place (via RenderTargetBitmap) des images du texte à moins que le texte change.

TileBrush

Si vous devez utiliser un VisualBrush ou un DrawingBrush dans une scène 3D car le contenu du pinceau n'est pas statique, essayez de mettre en cache le pinceau (en affectant à la propriété attachée CachingHint la valeur Cache). Définissez les seuils de l'invalidation de l'échelle minimum (avec les propriétés attachées CacheInvalidationThresholdMinimum et CacheInvalidationThresholdMaximum) et maximum afin que les pinceaux mis en cache ne soient pas trop fréquemment régénérés, tout en maintenant encore votre niveau de qualité souhaitée. Par défaut, DrawingBrush et VisualBrush ne sont pas mis en cache, ce qui signifie qu'à chaque fois que quelque chose peint avec le pinceau doit être restitué à nouveau, le contenu entier du pinceau doit d'abord être restitué à nouveau sur une surface intermédiaire.

BitmapEffect

BitmapEffect force tout le contenu affecté à être restitué sans accélération matérielle. Pour de meilleures performances, n'utilisez pas BitmapEffect.

Impact sur les performances : moyen

Propriété

Recommandation

MeshGeometry3D

Lorsqu'un maillage est défini comme triangles attenants avec des sommets partagés et que ces derniers ont la même position, les coordonnées normales de texture définissent chaque vertex partagé une seule fois, puis définissent vos triangles par index avec TriangleIndices.

ImageBrush

Essayez de réduire des tailles de texture lorsque vous avez le contrôle explicite sur la taille (lorsque vous utilisez un RenderTargetBitmap et/ou un ImageBrush). Notez que les textures de résolution inférieures peuvent réduire la qualité visuelle, donc essayez de rechercher le bon équilibre entre qualité et performance.

Opacité

Lorsque vous restituez le 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 Viewport3D translucide séparé en définissant Viewport3D.Opacity à une valeur inférieure à 1.

Viewport3D

Réduisez le nombre d'objets Viewport3D que vous utilisez dans une scène. Mettez de nombreux modèles 3D dans le même Viewport3D plutôt que de créer des instances Viewport3D séparées pour chaque modèle.

Freezable

En général, il est avantageux de réutiliser MeshGeometry3D, GeometryModel3D, pinceaux et matériaux. Tous peuvent avoir plusieurs parents puisqu'ils sont dérivés de Freezable.

Freezable

Appelez la méthode Freeze sur les Freezables lorsque leurs propriétés restent inchangées dans votre application. Le verrouillage peut diminuer le jeu de travail et augmenter la vitesse.

Brush

Utilisez ImageBrush au lieu de VisualBrush ou DrawingBrush lorsque le contenu du pinceau ne change pas. Le contenu 2D peut être converti en Image via RenderTargetBitmap puis peut être utilisé dans un ImageBrush.

BackMaterial

N'utilisez pas BackMaterial à moins que vous ne deviez réellement consulter les faces arrière de votre GeometryModel3D.

Light

Vitesse légère (de la plus rapide à la plus lente) :

AmbientLight

DirectionalLight

PointLight

SpotLight

MeshGeometry3D

Essayez de garder les tailles de maillage sous les limites suivantes :

Positions : 20 001 instances Point3D

TriangleIndices : 60 003 instances Int32

Material

Vitesse matérielle (de la plus rapide à la plus lente) :

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) 3D n'accepte pas les pinceaux invisibles (pinceaux ambiants noirs, pinceaux clairs, etc.) de manière homogène.  Envisagez omettant ces derniers de votre scène.

MaterialGroup

Chaque Material dans un MaterialGroup provoque un autre passe de rendu, ce qui signifie que l'intégration de nombreux matériaux, même simples, peut augmenter considérablement la demande 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 MatrixTransform3D unique, en le définissant comme étant le produit de toutes les transformations qui existerait 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 objets DirectionalLight, 70 objets PointLight ou 40 objets SpotLight.

ModelVisual3D

Séparez les objets en mouvement des objets statiques en les mettant dans des instances ModelVisual3D séparées. ModelVisual3D est plus "lourd" que GeometryModel3D car il met en cache des 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 mettre 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 modification de lumière force une régénération et une recompilation du nuanceur, à moins que cette configuration n'ait existé précédemment (et donc avait son nuanceur mis en cache).

Lumière

Les lumières noires ne seront pas visibles, mais s'ajouteront au temps de rendu, vous pouvez envisager de les omettre.

MeshGeometry3D

Pour réduire le temps de construction de grandes collections dans Windows Presentation Foundation (WPF), tel qu'un Positions, Normals, TextureCoordinates et TriangleIndices MeshGeometry3D, dimensionnez au préalable les collections avant le remplissage de valeur. Si possible, passez les structures de données préremplies des constructeurs des collections en tant que tableaux ou listes.

Voir aussi

Concepts

Vue d'ensemble des graphiques 3D