Freigeben über


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 Aliasedsetzen. 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 Freezableabgeleitet 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