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 |
Pinselgeschwindigkeit (absteigend): DrawingBrush (zwischengespeichert) VisualBrush (zwischengespeichert) DrawingBrush (nicht zwischengespeichert) VisualBrush (nicht zwischengespeichert) |
|
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). |
|
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). |
|
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. |
|
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. |
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 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 |
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. |
|
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. |
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. |
|
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. |
|
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. |
|
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. |
|
Verwenden Sie BackMaterial nur, wenn Sie die Backfaces von GeometryModel3D wirklich sehen müssen. |
|
Lichtgeschwindigkeit (absteigend): |
|
Versuchen Sie, unterhalb der folgenden Netzgrößen zu bleiben: Positions: 20.001 Point3D-Instanzen TriangleIndices: 60.003 Int32-Instanzen |
|
Materialgeschwindigkeit (absteigend): |
|
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. |
|
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 |
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. |
|
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. |
|
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. |
|
Ä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. |
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. |