Optimiser les performances 3D de WPF
Mise à jour : novembre 2007
Comme 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 tenir compte de l'optimisation des performances. Cette rubrique fournit une liste de classes et propriétés 3D qui ont des conséquences en terme de performance pour votre application, avec les recommandations pour optimiser les 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 |
Vitesse du pinceau (de la plus rapide à la plus lente) : DrawingBrush (mis en cache) VisualBrush (mis en cache) DrawingBrush (non mis en cache) VisualBrush (non mis en cache) |
|
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. |
|
Définissez Viewport3D.IsHitTestVisible avec la valeur False toutes les fois que vous n'avez pas besoin que Windows Presentation Foundation (WPF) tienne compte du contenu d'un Viewport3D lors de l'exécution du test d'atteinte de souris. Le contenu 3D du test d'atteinte s'effectue dans le logiciel et peut s'avérer lent avec les grands maillages. IsHitTestVisible est activé (lentement) par défaut sur Viewport3D. |
|
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. |
|
L'animation de maillage, c'est-à-dire la 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 de notifications des modifications lorsque chaque vertex est modifié, détachez le maillage de l'arborescence d'éléments visuels avant d'exécuter la modification par vertex. Une fois que le maillage a été modifié, rattachez-le à l'arborescence d'éléments visuels. Essayez également de réduire la taille des mailles qui seront animées dans cette direction. |
|
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. |
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 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 |
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. |
|
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. |
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. |
|
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. |
|
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. |
|
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. |
|
N'utilisez pas BackMaterial à moins que vous ne deviez réellement consulter les faces arrière de votre GeometryModel3D. |
|
Vitesse légère (de la plus rapide à la plus lente) : |
|
Essayez de garder les tailles de maillage sous les limites suivantes : Positions : 20 001 instances Point3D TriangleIndices : 60 003 instances Int32 |
|
Vitesse matérielle (de la plus rapide à la plus lente) : |
|
Le 3D Windows Presentation Foundation (WPF) n'accepte pas les pinceaux invisibles (pinceaux ambiants noirs, pinceaux clairs, etc.) de façon cohérente. Envisagez d'omettre ceux-ci de votre scène. |
|
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 |
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. |
|
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 du logiciel. Les limites sont d'environ 110 objets DirectionalLight, 70 objets PointLight ou 40 objets SpotLight. |
|
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. |
|
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. |
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