Maximieren der 3D-Leistung von WPF

Bei der Erstellung von 3D-Steuerelementen und der Einbindung von 3D-Szenen in Anwendungen mithilfe von Windows Presentation Foundation (WPF) muss auch die Leistungsoptimierung berücksichtigt werden. In diesem Thema werden die 3D-Klassen und 3D-Eigenschaften aufgelistet, die die Leistung von Anwendungen beeinflussen. Darüber hinaus werden Empfehlungen zur Leistungsoptimierung bei der Verwendung der jeweiligen Klassen und Eigenschaften gegeben.

In diesem Thema werden fortgeschrittene Kenntnisse der 3D-Features von Windows Presentation Foundation (WPF) vorausgesetzt. Die Vorschläge in diesem Dokument gelten für die "Renderingebene 2", d. h. allgemein für Hardware, die Pixel-Shader der Version 2.0 und Vertex-Shader der Version 2.0 unterstützt. Weitere Informationen finden Sie unter Renderingebenen für Grafiken.

Auswirkung auf die Leistung: Hoch

Eigenschaft

Empfehlung

Brush

Pinselgeschwindigkeit (absteigend):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (zwischengespeichert)

VisualBrush (zwischengespeichert)

RadialGradientBrush

DrawingBrush (nicht zwischengespeichert)

VisualBrush (nicht zwischengespeichert)

ClipToBoundsProperty

Legen Sie Viewport3D.ClipToBounds immer auf false fest, wenn Windows Presentation Foundation (WPF) den Inhalt eines Viewport3D-Elements nicht unbedingt auf das Viewport3D-Rechteck zuschneiden muss. Das Windows Presentation Foundation (WPF)-Clipping mit Antialiasing kann sehr langsam sein, und ClipToBounds wird standardmäßig für Viewport3D aktiviert (langsam).

IsHitTestVisible

Legen Sie Viewport3D.IsHitTestVisible immer auf "false" fest, wenn Windows Presentation Foundation (WPF) den Inhalt eines Viewport3D bei Maustreffertests nicht unbedingt berücksichtigen muss. Treffertests für 3D-Inhalte werden in der Software ausgeführt und können bei großen Netzen sehr langsam sein. IsHitTestVisible wird standardmäßig für Viewport3D aktiviert (langsam).

GeometryModel3D

Erstellen Sie andere Modelle nur, wenn sie andere Materialien oder Transformationen benötigen. Andernfalls versuchen Sie, viele GeometryModel3D-Instanzen mit denselben Materialien und Transformationen zu einigen größeren GeometryModel3D-Instanzen und MeshGeometry3D-Instanzen zusammenzufügen.

MeshGeometry3D

Die Animation des Netzes, d. h. die Änderung der einzelnen Eckpunkte eines Netzes auf Framebasis, ist in Windows Presentation Foundation (WPF) nicht immer effizient. Um die Auswirkungen von Änderungsbenachrichtigungen auf die Leistung nach jeder Änderung eines Eckpunkts zu minimieren, trennen Sie das Netz von der visuellen Struktur, bevor Sie die Eckpunkte einzeln ändern. Nach der Änderung fügen Sie das Netz wieder der visuellen Struktur hinzu. Versuchen Sie außerdem, die Größe der Netze zu minimieren, die auf diese Art animiert werden.

3D-Antialiasing

Um das Rendering zu beschleunigen, deaktivieren Sie das Multisampling für ein Viewport3D, indem Sie die angefügten EdgeMode-Eigenschaft auf Aliased festlegen. 3D-Antialiasing ist unter Microsoft Windows XP standardmäßig deaktiviert und unter Windows Vista mit vier Abtastungen pro Pixel aktiviert.

Text

Livetext in einer 3D-Szene (live, weil er sich in DrawingBrush oder VisualBrush befindet) kann langsam sein. Versuchen Sie stattdessen, Bilder des Texts (über RenderTargetBitmap) zu verwenden, außer wenn sich der Text ändert.

TileBrush

Wenn Sie VisualBrush oder DrawingBrush in einer 3D-Szene verwenden müssen, weil der Inhalt des Pinsels nicht statisch ist, versuchen Sie, den Pinsel zwischenzuspeichern (durch Festlegen der angefügten CachingHint-Eigenschaft auf Cache). Legen Sie den unteren und oberen Schwellenwert für die Ungültigkeit (mit den angefügten Eigenschaften CacheInvalidationThresholdMinimum und CacheInvalidationThresholdMaximum) so fest, dass die zwischengespeicherten Pinsel nur so oft neu generiert werden, dass das gewünschte Qualitätsniveau erhalten bleibt. DrawingBrush und VisualBrush werden standardmäßig nicht zwischengespeichert. Dies bedeutet: Immer wenn Elemente, die mit dem Pinsel gezeichnet wurden, neu gerendert werden sollen, muss zuerst der gesamte Inhalt des Pinsels in einer Zwischenoberfläche neu gerendert werden.

BitmapEffect

BitmapEffect erzwingt, dass alle betroffenen Inhalte ohne Hardwarebeschleunigung gerendert werden. Um eine optimale Leistung zu erzielen, verwenden Sie nicht BitmapEffect.

Auswirkung auf die Leistung: Mittel

Eigenschaft

Empfehlung

MeshGeometry3D

Wenn ein Netz als aneinander grenzende Dreiecke mit gemeinsamen Eckpunkten definiert ist und diese Eckpunkte dieselbe Position, dieselbe Normale und dieselben Texturkoordinaten haben, definieren Sie jeden gemeinsamen Eckpunkt nur einmal und anschließend die Dreiecke mit TriangleIndices nach Index.

ImageBrush

Versuchen Sie, die Texturgrößen zu minimieren, wenn Sie die explizite Kontrolle über die Größe haben (d. h., wenn Sie RenderTargetBitmap und/oder ImageBrush verwenden). Texturen mit geringerer Auflösung können die visuelle Qualität verringern. Versuchen Sie daher, die richtige Balance zwischen Qualität und Leistung zu finden.

Durchlässigkeit

Beim Rendering lichtdurchlässiger 3D-Inhalte (wie Reflektionen) verwenden Sie die Durchlässigkeitseigenschaften für Pinsel oder Materialien (über Opacity oder Color), anstatt ein separates lichtdurchlässiges Viewport3D zu erstellen. Legen Sie Viewport3D.Opacity dazu auf einen Wert kleiner als 1 fest.

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 von Vorteil, MeshGeometry3D, GeometryModel3D, Pinsel und Materialien mehrfach zu verwenden. Alle können mehrere übergeordnete Objekte haben, da sie von Freezable abgeleitet werden.

Freezable

Rufen Sie die Freeze-Methode für Freezable-Objekte auf, wenn ihre Eigenschaften in der Anwendung unverändert bleiben. Das Fixieren kann das Workingset verkleinern und die Geschwindigkeit erhöhen.

Brush

Verwenden Sie ImageBrush statt VisualBrush oder DrawingBrush, wenn sich der Inhalt des Pinsels nicht ändert. 2D-Inhalt kann über RenderTargetBitmap in Image konvertiert und dann in ImageBrush verwendet werden.

BackMaterial

Verwenden Sie BackMaterial nur, wenn Sie die Backfaces von GeometryModel3D wirklich sehen müssen.

Light

Lichtgeschwindigkeit (absteigend):

AmbientLight

DirectionalLight

PointLight

SpotLight

MeshGeometry3D

Versuchen Sie, unterhalb der folgenden Netzgrößen zu bleiben:

Positions: 20.001 Point3D-Instanzen

TriangleIndices: 60.003 Int32-Instanzen

Material

Materialgeschwindigkeit (absteigend):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) verzichtet nicht immer auf nicht sichtbare Pinsel (schwarze Umgebungspinsel, klare Pinsel usw.). Überlegen Sie, ob Sie sie ggf. aus der Szene entfernen können.

MaterialGroup

Jedes Material-Element in MaterialGroup führt zu einem weiteren Renderingdurchlauf, sodass die Aufnahme vieler Materialen, auch einfacher Materialien, die Füllanforderungen der GPU drastisch erhöhen kann. Minimieren Sie also die Anzahl von Materialien in MaterialGroup.

Auswirkung auf die Leistung: Niedrig

Eigenschaft

Empfehlung

Transform3DGroup

Wenn keine Animation oder Datenbindung erforderlich ist, verwenden Sie anstelle einer Transformationsgruppe mit mehreren Transformationen ein einzelnes MatrixTransform3D, und legen Sie es als Produkt aller Transformationen fest, die ansonsten unabhängig voneinander in der Transformationsgruppe existieren würden.

Light

Minimieren Sie die Anzahl von Lichtern in der Szene. Zu viele Lichter in einer Szene zwingen Windows Presentation Foundation (WPF), auf das Softwarerendering zurückzugreifen. Die Obergrenzen liegen ungefähr bei 110 DirectionalLight-Objekten, 70 PointLight-Objekten oder 40 SpotLight-Objekten.

ModelVisual3D

Trennen Sie bewegliche Objekte von statischen Objekten, indem Sie sie in separaten ModelVisual3D-Instanzen platzieren. ModelVisual3D ist "schwerer" als GeometryModel3D, da es transformierte Begrenzungen zwischenspeichert. GeometryModel3D wurde als Modell und ModelVisual3D als Szenenknoten optimiert. Verwenden Sie ModelVisual3D, um freigegebene Instanzen von GeometryModel3D in der Szene zu platzieren.

Light

Ändern Sie die Anzahl der Lichter in der Szene möglichst selten. Nach jeder Änderung der Lichteranzahl muss der Shader neu generiert und kompiliert werden, es sei denn, die jeweilige Konfiguration lag schon einmal vor (und der zugehörige Shader ist noch zwischengespeichert).

Licht

Schwarze Lichter sind zwar nicht sichtbar, verlängern aber das Rendering. Überlegen Sie daher, ob Sie darauf verzichten können.

MeshGeometry3D

Um die Erstellung großer Auflistungen in Windows Presentation Foundation (WPF) wie Positions, Normals, TextureCoordinates und TriangleIndices für MeshGeometry3D zu beschleunigen, legen Sie die Größe der Auflistungen fest, bevor diese mit Werten aufgefüllt werden. Übergeben Sie nach Möglichkeit vorab gefüllte Datenstrukturen wie Arrays oder Listen an die Konstruktoren der Auflistungen.

Siehe auch

Konzepte

Übersicht über 3D-Grafiken