Maximieren der 3D-Leistung von WPF

Wenn Sie die Windows Presentation Foundation (WPF) verwenden, um 3D-Steuerelemente zu erstellen und 3D-Szenen in Ihre Anwendungen einzuschließen, ist es wichtig, die Leistungsoptimierung zu berücksichtigen. In diesem Thema finden Sie eine Liste der 3D-Klassen und -Eigenschaften, die Leistungsauswirkungen für Ihre Anwendung haben, sowie Empfehlungen zur Optimierung der Leistung, wenn Sie sie verwenden.

In diesem Thema werden fortschrittliche Kenntnisse in Windows Presentation Foundation (WPF)-3D-Features vorausgesetz. Die Vorschläge in diesem Dokument gelten für „Renderingebene 2“ – grob definiert als Hardware, die Pixel Shader Version 2.0 und Vertex Shader Version 2.0 unterstützt. Weitere Einzelheiten finden Sie unter Grafik-Rendering-Ebenen.

Auswirkungen auf die Leistung: hoch

Eigenschaft Empfehlung
Brush Pinselgeschwindigkeit (schnellste zuerst):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (zwischengespeichert)

VisualBrush (zwischengespeichert)

RadialGradientBrush

DrawingBrush (nicht zwischengespeichert)

VisualBrush (nicht zwischengespeichert)
ClipToBoundsProperty Setzen Sie den Viewport3D.ClipToBounds-Wert auf „false“, wenn Sie nicht möchten, dass die Windows Presentation Foundation (WPF) den Inhalt von Viewport3D explizit an das Viewport3D-Rechteck anpasst. Windows Presentation Foundation (WPF) Antialiasing Clipping kann sehr langsam sein und ClipToBounds ist standardmäßig aktiviert (langsam) auf Viewport3D.
IsHitTestVisible Legen Sie für Viewport3D.IsHitTestVisible "false" fest, wenn Sie Windows Presentation Foundation (WPF) nicht benötigen, um den Inhalt einer Viewport3D-Datei beim Ausführen von Maustreffertests in Betracht zu ziehen. Treffertests von 3D-Inhalten werden in Software durchgeführt und können bei großen Meshs langsam sein. IsHitTestVisible ist standardmäßig (langsam) auf Viewport3D aktiviert.
GeometryModel3D Erstellen Sie nur unterschiedliche Modelle, wenn sie unterschiedliche Materialien oder Transformationen benötigen. Andernfalls versuchen Sie, viele GeometryModel3D-Instanzen mit den gleichen Materialien und Transformationen in ein paar größere GeometryModel3D- undMeshGeometry3D-Instanzen zusammenzufügen.
MeshGeometry3D Die Mesh-Animation – das Ändern der einzelnen Vertices eines Meshes auf Framebasis – ist in Windows Presentation Foundation (WPF) nicht immer effizient. Um die Leistungswirkung von Änderungsbenachrichtigungen zu minimieren, wenn jeder Vertex geändert wird, trennen Sie das Gitter aus der visuellen Struktur, bevor sie pro Vertexänderung ausgeführt werden. Sobald das Mesh geändert wurde, bringen Sie es erneut an der visuellen Struktur an. Versuchen Sie auch, die Größe von Meshes 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 angefügte Eigenschaft EdgeMode auf Aliased festlegen. Standardmäßig ist 3D-Antialiasing auf Windows mit 4 Proben pro Pixel aktiviert.
Text Livetext in einer 3D-Szene (live, weil es sich in einem DrawingBrush oder VisualBrush befindet), kann langsam sein. Versuchen Sie, Bilder des Texts stattdessen (über RenderTargetBitmap) zu verwenden, es sei denn, der Text wird geändert.
TileBrush Wenn Sie einen VisualBrush oder einen DrawingBrush in einer 3D-Szene verwenden müssen, da der Inhalt des Pinsels nicht statisch ist, versuchen Sie, den Pinsel zwischenzuspeichern (festlegen der angefügten Eigenschaft CachingHint auf Cache). Legen Sie die Schwellenwerte für die minimale und maximale Skalierung (mit den angefügten Eigenschaften CacheInvalidationThresholdMinimum und CacheInvalidationThresholdMaximum) fest, damit die zwischengespeicherten Pinsel nicht zu häufig regeneriert werden, während Sie weiterhin die gewünschte Qualität beibehalten. Standardmäßig sind DrawingBrush und VisualBrush nicht zwischengespeichert, was bedeutet, dass jedes Mal, wenn etwas mit dem Pinsel bemalt wird, erneut gerendert werden muss, muss der gesamte Inhalt des Pinsels zuerst auf eine Zwischenoberfläche gerendert werden.
BitmapEffect BitmapEffect erzwingt, dass alle betroffenen Inhalte ohne Hardwarebeschleunigung gerendert werden. Verwenden Sie für optimale Leistung nicht BitmapEffect.

Auswirkungen auf die Leistung: mittel

Eigenschaft Empfehlung
MeshGeometry3D Wenn ein Netz als aneinanderstoßende Dreiecke mit gemeinsamen Scheitelpunkten definiert ist und diese Scheitelpunkte dieselben Positions-, Normal- und Texturkoordinaten haben, definieren Sie jeden gemeinsamen Scheitelpunkt nur einmal und definieren Sie dann Ihre Dreiecke nach Index mit TriangleIndices.
ImageBrush Versuchen Sie, Texturgrößen zu minimieren, wenn Sie explizite Kontrolle über die Größe haben (wenn Sie ein RenderTargetBitmap und/oder ein ImageBrush verwenden). Beachten Sie, dass Texturen mit geringerer Auflösung die visuelle Qualität verringern können, sodass Sie versuchen, das richtige Gleichgewicht zwischen Qualität und Leistung zu finden.
Opacity Verwenden Sie beim Rendern transluzenter 3D-Inhalte (z. B. Spiegelungen) die Deckkrafteigenschaften für Pinsel oder Materialien (über Opacity oder Color) anstatt eine separate durchsichtige Viewport3D zu erstellen, indem Sie für Viewport3D.Opacity einen Wert unter 1 festlegen.
Viewport3D Minimieren Sie die Anzahl der Viewport3D-Objekte, die Sie in einer Szene verwenden. Legen Sie viele 3D-Modelle in das gleiche Viewport3D-Objekt, anstatt separate Viewport3D-Instanzen für jedes Modell zu erstellen.
Freezable In der Regel ist es nützlich, MeshGeometry3D, GeometryModel3D, Pinsel und Materialien wiederzuverwenden. Alle sind multiparentierbar, da sie von Freezable abgeleitet sind.
Freezable Rufen Sie die Freeze-Methode auf Freezables auf, wenn ihre Eigenschaften in Ihrer Anwendung unverändert bleiben. Das Einfrieren kann die Arbeitsmenge 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 ein Image über RenderTargetBitmap konvertiert werden und dann in einem ImageBrush verwendet werden.
BackMaterial Verwenden Sie nicht BackMaterial, es sei denn, Sie müssen tatsächlich die Rückenflächen Ihrer GeometryModel3D sehen.
Light Lichtgeschwindigkeit (schnellste zuerst):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Versuchen Sie, Mesh-Größen unter diesen Grenzwerten zu halten:

Positions: 20.001 Point3D-Instanzen

TriangleIndices:60.003 Int32-Instanzen
Material Materialgeschwindigkeit (schnellste zuerst):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D deaktiviert keine unsichtbaren Pinsel (schwarze Umgebungspinsel, klare Pinsel usw.) auf konsistente Weise. Ziehen Sie es in Betracht, diese aus Ihrer Szene auszulassen.
MaterialGroup Jedes Material in einer MaterialGroup verursacht einen weiteren Rendering-Durchlauf, sodass das Einbeziehen vieler Materialien, selbst einfacher Materialien, die Füllanforderungen an Ihren Grafikprozessor dramatisch erhöhen kann. Minimieren Sie die Anzahl der Materialien in Ihrer MaterialGroup.

Auswirkungen auf die Leistung: niedrig

Eigenschaft Empfehlung
Transform3DGroup Wenn Sie keine Animation oder Datenbindung benötigen, verwenden Sie statt einer Transformationsgruppe, die mehrere Transformationen enthält, eine einzige MatrixTransform3D, die das Produkt aller Transformationen ist, die sonst unabhängig voneinander in der Transformationsgruppe existieren würden.
Light Minimieren Sie die Anzahl der Lichter in Ihrer Szene. Zu viele Lichter in einer Szene erzwingen, dass Windows Presentation Foundation (WPF) auf das Softwarerendering zurückgreift. 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 packen. ModelVisual3D ist "schwerer" als GeometryModel3D, weil es transformierte Begrenzungen zwischenspeichert. GeometryModel3D ist als Modell optimiert; ModelVisual3D ist als Szeneknoten optimiert. Verwenden Sie ModelVisual3D, um freigegebene Instanzen von GeometryModel3D in Szene zu setzen.
Light Minimieren Sie Häufigkeit, mit der Sie die Anzahl der Lichter in der Szene ändern. Jede Änderung der Lichtanzahl erzwingt eine Shader-Regeneration und erneute Kompilierung, es sei denn, diese Konfiguration war zuvor vorhanden (und hatte somit einen Shader zwischengespeichert).
Hell Schwarze Lichter sind zwar nicht sichtbar, aber sie verlängern die Renderzeit.
MeshGeometry3D Um die Konstruktionszeit großer Sammlungen in der Windows Presentation Foundation (WPF) zu minimieren, wie z. B. die MeshGeometry3Ds Positions, Normals, TextureCoordinates, und TriangleIndices, können Sie die Größe der Sammlungen vor der Belegung mit Werten voreinstellen. Wenn möglich, übergeben Sie den Konstruktoren der Sammlungen vorgefüllte Datenstrukturen wie Arrays oder Listen.

Weitere Informationen