Maximieren der WPF 3D-Leistung
Wenn Sie windows Presentation Foundation (WPF) zum Erstellen von 3D-Steuerelementen verwenden und 3D-Szenen in Ihre Anwendungen einbeziehen, ist es wichtig, die Leistungsoptimierung zu berücksichtigen. Dieses Thema enthält eine Liste der 3D-Klassen und -Eigenschaften, die Leistungsauswirkungen für Ihre Anwendung haben, sowie Empfehlungen für die Optimierung der Leistung, wenn Sie sie verwenden.
In diesem Thema wird vorausgesetzt, dass ein fortgeschrittenes Verständnis der Windows Presentation Foundation (WPF)-3D-Features vorhanden ist. Die Vorschläge in diesem Dokument gelten für "Rendering-Stufe 2", die grob als Hardware definiert ist, die Pixel-Shader-Version 2.0 und Vertex-Shader-Version 2.0 unterstützt. Weitere Informationen finden Sie unter Grafik-Rendering-Stufen.
Leistungsbeeinträchtigung: Hoch
Eigentum | Empfehlung |
---|---|
Brush | Geschwindigkeit des Pinsels (von am schnellsten bis am langsamsten): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (zwischengespeichert) VisualBrush (zwischengespeichert) RadialGradientBrush DrawingBrush (nicht zwischengespeichert) VisualBrush (nicht zwischengespeichert) |
ClipToBoundsProperty | Setzen Sie Viewport3D.ClipToBounds auf "false", wann immer es nicht erforderlich ist, dass die Windows Presentation Foundation (WPF) den Inhalt eines Viewport3D explizit auf das Rechteck von Viewport3D zuschneidet. Windows Presentation Foundation (WPF) Antialiased Clipping kann sehr langsam sein und ClipToBounds ist standardmäßig (langsam) auf Viewport3Daktiviert. |
IsHitTestVisible | Legen Sie Viewport3D.IsHitTestVisible auf "false" fest, wenn Sie nicht benötigen, dass die Windows Presentation Foundation (WPF) den Inhalt eines Viewport3D bei Maustreffertests berücksichtigt. Die Trefferprüfung bei 3D-Inhalten erfolgt in der Software und kann bei großen Meshes langsam sein. IsHitTestVisible ist standardmäßig für Viewport3Daktiviert (langsam). |
GeometryModel3D | Erstellen Sie unterschiedliche Modelle nur, wenn sie unterschiedliche Materialien oder Transformationen benötigen. Andernfalls versuchen Sie, viele GeometryModel3D-Instanzen mit denselben Materialien und Transformationen in ein paar größere GeometryModel3D- und MeshGeometry3D-Instanzen zusammenzufassen. |
MeshGeometry3D | Die Gitteranimation – das Ändern der einzelnen Scheitelpunkte eines Gitters pro Frame – ist in Windows Presentation Foundation (WPF) nicht immer effizient. Um die Leistungsauswirkungen von Änderungsbenachrichtigungen zu minimieren, wenn jeder Scheitelpunkt geändert wird, trennen Sie das Gitter vom visuellen Elementbaum, bevor Sie Änderungen pro Scheitelpunkt durchführen. Sobald das Mesh geändert wurde, befestigen Sie es erneut an der visuellen Baumstruktur. Versuchen Sie außerdem, die Größe von Gittern zu minimieren, die auf diese Weise animiert werden. |
3D Antialiasing | Um die Renderinggeschwindigkeit zu erhöhen, deaktivieren Sie Multisampling auf einem Viewport3D, indem Sie die angehängte Eigenschaft EdgeMode auf Aliased setzen. Standardmäßig ist 3D-Antialiasing unter Windows mit 4 Beispielen pro Pixel aktiviert. |
Text | Live-Text in einer 3D-Szene (live, weil er sich in einem DrawingBrush oder VisualBrushbefindet) kann langsam sein. Versuchen Sie stattdessen, Bilder des Texts (über RenderTargetBitmap) zu verwenden, es sei denn, der Text ändert sich. |
TileBrush | Wenn Sie eine VisualBrush oder eine DrawingBrush in einer 3D-Szene verwenden müssen, da der Inhalt des Pinsels nicht statisch ist, versuchen Sie, den Pinsel zu zwischenspeichern (Festlegen der angefügten Eigenschaft CachingHint auf Cache ). Legen Sie die Schwellenwerte für die minimale und maximale Skalierungsinvalidierung (mit den angefügten Eigenschaften CacheInvalidationThresholdMinimum und CacheInvalidationThresholdMaximum) fest, sodass die zwischengespeicherten Pinsel nicht zu häufig neu generiert werden, während die gewünschte Qualität erhalten bleibt. Standardmäßig werden DrawingBrush und VisualBrush nicht zwischengespeichert, d. h., jedes Mal, wenn etwas mit dem Pinsel neu gerendert werden muss, muss der gesamte Inhalt des Pinsels zuerst erneut auf eine Zwischenoberfläche gerendert werden. |
BitmapEffect | BitmapEffect erzwingt, dass alle betroffenen Inhalte ohne Hardwarebeschleunigung gerendert werden. Verwenden Sie BitmapEffectnicht, um optimale Leistung zu erzielen. |
Leistungswirkung: Mittel
Eigentum | Empfehlung |
---|---|
MeshGeometry3D | Wenn ein Gitter als angrenzende Dreiecke mit gemeinsamen Scheitelpunkten definiert ist und diese Scheitelpunkte dieselbe Position, Normale und Texturkoordinaten aufweisen, definieren Sie jeden gemeinsamen Scheitelpunkt nur einmal und definieren Sie dann Ihre Dreiecke mittels Indexen mit TriangleIndices. |
ImageBrush | Versuchen Sie, die Texturgrößen zu minimieren, wenn Sie explizite Kontrolle über die Größe haben, beispielsweise beim Verwenden eines RenderTargetBitmap und/oder eines ImageBrush. Beachten Sie, dass Texturen mit geringerer Auflösung die visuelle Qualität verringern können. Versuchen Sie daher, das richtige Gleichgewicht zwischen Qualität und Leistung zu finden. |
Undurchsichtigkeit | Verwenden Sie beim Rendern von transluzenten 3D-Inhalten (z. B. Spiegelungen) die Opazitätseigenschaften für Pinsel oder Materialien (über Opacity oder Color), anstatt einen eigenen transluzenten Viewport3D zu erstellen, indem Sie Viewport3D.Opacity auf einen Wert unter 1 festlegen. |
Viewport3D | Minimieren Sie die Anzahl der Viewport3D Objekte, die Sie in einer Szene verwenden. Platzieren Sie viele 3D-Modelle in demselben Viewport3D,anstatt separate Viewport3D-Instanzen für jedes Modell zu erstellen. |
Freezable | In der Regel ist es vorteilhaft, MeshGeometry3D, GeometryModel3D, Pinsel und Materialien wiederzuverwenden. Alle sind multiparenierbar, da sie von Freezable abgeleitet sind. |
Freezable | Rufen Sie die Freeze-Methode für Freezables auf, wenn ihre Eigenschaften in Ihrer Anwendung unverändert bleiben. Das Einfrieren kann den Arbeitssatz verringern und die Geschwindigkeit erhöhen. |
Brush | Verwenden Sie ImageBrush anstelle von VisualBrush oder DrawingBrush, wenn sich der Inhalt des Pinsels nicht ändert. 2D-Inhalte können in eine Image über RenderTargetBitmap konvertiert und dann in einem ImageBrushverwendet werden. |
BackMaterial | Verwenden Sie BackMaterial nicht, es sei denn, Sie müssen tatsächlich die Rückseiten Ihrer GeometryModel3Dsehen. |
Light | Geschwindigkeiten (von schnell bis langsam): AmbientLight DirectionalLight PointLight SpotLight |
MeshGeometry3D | Versuchen Sie, Gittergrößen unter diesen Grenzwerten beizubehalten: Positions: 20.001 Point3D Instanzen TriangleIndices: 60,003 Int32 Instanzen |
Material | Materialgeschwindigkeit (von schnellster bis langsamster): EmissiveMaterial DiffuseMaterial SpecularMaterial |
Brush | Windows Presentation Foundation (WPF) 3D schließt unsichtbare Pinsel (schwarze Umgebungslicht-Pinsel, klare Pinsel usw.) nicht auf einheitliche Weise aus. Erwägen Sie, diese aus Ihrer Szene wegzulassen. |
MaterialGroup | Jede Material in einem MaterialGroup verursacht einen zusätzlichen Renderingdurchlauf, sodass das Einbinden vieler Materialien, auch einfacher, die Auslastung Ihrer GPU erheblich erhöhen kann. Minimieren Sie die Anzahl der Materialien in Ihrer MaterialGroup. |
Leistungseinbußen: Niedrig
Eigentum | Empfehlung |
---|---|
Transform3DGroup | Wenn Sie keine Animation oder Datenbindung benötigen, verwenden Sie anstelle einer Transformationsgruppe, die mehrere Transformationen enthält, eine einzelne MatrixTransform3D, wobei sie das Produkt aller Transformationen sein soll, die sonst unabhängig in der Transformationsgruppe vorhanden wären. |
Light | Minimieren Sie die Anzahl der Lichter in Ihrer Szene. Zu viele Lichter in einer Szene zwingen Windows Presentation Foundation (WPF), auf das Softwarerendering zurückzugreifen. Die Grenzwerte sind etwa 110 DirectionalLight Objekte, 70 PointLight Objekte oder 40 SpotLight Objekte. |
ModelVisual3D | Trennen Sie bewegliche Objekte von statischen Objekten, indem Sie sie in separate ModelVisual3D-Instanzen platzieren. ModelVisual3D ist "schwerer" als GeometryModel3D, da sie transformierte Grenzen zwischenspeichert. GeometryModel3D ist für ein Modell optimiert; ModelVisual3D ist für einen Szenenknoten optimiert. Verwenden Sie ModelVisual3D, um gemeinsam genutzte Instanzen von GeometryModel3D in die Szene zu setzen. |
Light | Minimieren Sie die Anzahl der Male, mit denen Sie die Anzahl der Lichter in der Szene ändern. Jede Änderung der Lichtanzahl erzwingt eine Shaderregenerierung und -neukompilierung, es sei denn, diese Konfiguration war zuvor vorhanden (und hatte daher den Shader zwischengespeichert). |
Licht | Schwarze Lichter werden nicht sichtbar sein, aber sie erhöhen die Renderzeit; überlegen Sie, sie wegzulassen. |
MeshGeometry3D | Um die Erstellungszeit großer Sammlungen in Windows Presentation Foundation (WPF) zu minimieren, z. B. einer MeshGeometry3D’s Positions, Normals, TextureCoordinatesund TriangleIndices, sollten die Auflistungen vor dem Befüllen mit Werten vorab dimensioniert werden. Wenn möglich, übergeben Sie den Konstruktoren der Kollektionen vorgefüllte Datenstrukturen wie Arrays oder Listen. |
Siehe auch
.NET Desktop feedback