Optimieren der Leistung: Layout und Entwurf
Der Entwurf Ihrer WPF-Anwendung kann deren Leistung durch unnötigen Verwaltungsaufwand bei der Berechnung des Layouts und bei der Überprüfung von Objektverweisen beeinflussen. Das Erstellen von Objekten, besonders zur Laufzeit, kann sich im Leistungsverhalten der Anwendung bemerkbar machen.
Dieses Thema enthält Empfehlungen zur Leistungssteigerung in diesen Bereichen.
Layout
Der Begriff "Layoutdurchlauf" beschreibt den Vorgang des Messens und Anordnens der Member einer Auflistung untergeordneter Elemente eines von Panel abgeleiteten Objekts und deren anschließender Zeichnung auf dem Bildschirm. Der Layoutdurchlauf ist ein rechenintensiver Vorgang. Je mehr untergeordnete Elemente sich in der Auflistung befinden, desto mehr Rechenschritte sind nötig. Jedes Mal, wenn ein untergeordnetes UIElement-Objekt in der Auflistung seine Position ändert, kann ein neuer Durchlauf des Layoutsystems ausgelöst werden. Aufgrund der engen Beziehung zwischen Objektmerkmalen und Layoutverhalten ist ein Verständnis der Ereignistypen wichtig, die das Layoutsystem aufrufen können. Die Anwendung bietet eine bessere Leistung, wenn möglichst wenige unnötige Aufrufe des Layoutdurchlaufs erfolgen.
Das Layoutsystem führt pro untergeordnetem Member in einer Auflistung zwei Durchläufe aus: eine Maßübergabe und eine Anordnungsübergabe. Jedes untergeordnete Objekt bietet eine eigene überschriebene Implementierung der Measure-Methode und der Arrange-Methode, um sein eigenes spezifisches Layoutverhalten bereitzustellen. Im einfachsten Fall ist das Layout ein rekursives System, das dafür sorgt, dass ein Element in der Größe angepasst, positioniert und auf dem Bildschirm gezeichnet wird.
Ein untergeordnetes UIElement-Objekt startet den Layoutvorgang, indem zuerst dessen Kerneigenschaften gemessen werden.
Die FrameworkElement-Eigenschaften des Objekts, die mit der Größe zusammenhängen, z. B. Width, Height und Margin, werden ausgewertet.
Die spezifische Logik von Panel, z. B. die Dock-Eigenschaft von DockPanel oder die Orientation-Eigenschaft von StackPanel, wird angewendet.
Der Inhalt wird angeordnet bzw. positioniert, nachdem alle untergeordneten Objekte gemessen wurden.
Die Auflistung von untergeordneten Objekten wird auf dem Bildschirm gezeichnet.
Der Layoutdurchlaufprozess wird erneut aufgerufen, wenn eine der folgenden Aktionen ausgeführt wird:
Der Auflistung wird ein untergeordnetes Objekt hinzugefügt.
Eine LayoutTransform wird auf das untergeordnete Objekt angewendet.
Die UpdateLayout-Methode wird für das untergeordnete Objekt aufgerufen.
Wenn der Wert einer Abhängigkeitseigenschaft, die mit Metadaten markiert ist, die die Maß- oder Anordnungsübergaben betreffen, geändert wird.
Verwenden des effizientesten Panels (nach Möglichkeit)
Die Komplexität des Layoutvorgangs basiert direkt auf dem Layoutverhalten der von Panel abgeleiteten Elemente, die verwendet werden. So bietet ein Grid-Steuerelement oder ein StackPanel-Steuerelement viel mehr Funktionen als ein Canvas-Steuerelement. Der Preis für diese Mehrzahl an Funktionen ist eine stärkere Beeinträchtigung der Leistung. Wenn Sie allerdings die Funktionen eines Grid-Steuerelements nicht benötigen, sollten Sie die weniger leistungsbeeinträchtigenden Alternativen verwenden, z. B. Canvas oder ein benutzerdefiniertes Panel.
Weitere Informationen finden Sie unter Übersicht über Panel-Elemente.
Aktualisieren statt Ersetzen von RenderTransform
Sie können eine Transform aktualisieren statt sie als Wert einer RenderTransform-Eigenschaft zu ersetzen. Dies gilt insbesondere für Szenarien, die Animationen einschließen. Durch die Aktualisierung einer vorhandenen Transform vermeiden Sie eine unnötige Layoutberechnung.
Erstellen der Struktur mithilfe eines Top-Down-Ansatzes
Wenn der logischen Struktur ein Knoten hinzugefügt oder daraus entfernt wird, werden Ungültigkeitserklärungen von Eigenschaften für das übergeordnete Element des Knotens und alle untergeordneten Elemente ausgelöst. Daher sollte immer ein Konstruktionsmuster mit einem Top-Down-Ansatz gewählt werden, um den Aufwand für unnötige Ungültigkeitserklärungen von Knoten, die bereits überprüft wurden, zu vermeiden. In der folgenden Tabelle ist der Unterschied in der Ausführungsgeschwindigkeit aufgeführt, wenn eine Struktur mit dem Top-Down-Ansatz bzw. mit dem Bottom-Up-Ansatz erstellt wird, wobei die Struktur 150 Ebenen tief ist mit einem einzelnen TextBlock und einem DockPanel auf jeder Ebene.
Aktion |
Strukturerstellung (in ms) |
Rendern - einschließlich Strukturerstellung (in ms) |
---|---|---|
Bottom-Up-Ansatz |
366 |
454 |
Top-Down-Ansatz |
11 |
96 |
Im folgenden Codebeispiel wird das Erstellen einer Struktur mit dem Top-Down-Ansatz gezeigt.
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim textBlock As New TextBlock()
textBlock.Text = "Default"
Dim parentPanel As New DockPanel()
Dim childPanel As DockPanel
myCanvas.Children.Add(parentPanel)
myCanvas.Children.Add(textBlock)
For i As Integer = 0 To 149
textBlock = New TextBlock()
textBlock.Text = "Default"
parentPanel.Children.Add(textBlock)
childPanel = New DockPanel()
parentPanel.Children.Add(childPanel)
parentPanel = childPanel
Next i
End Sub
private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "Default";
DockPanel parentPanel = new DockPanel();
DockPanel childPanel;
myCanvas.Children.Add(parentPanel);
myCanvas.Children.Add(textBlock);
for (int i = 0; i < 150; i++)
{
textBlock = new TextBlock();
textBlock.Text = "Default";
parentPanel.Children.Add(textBlock);
childPanel = new DockPanel();
parentPanel.Children.Add(childPanel);
parentPanel = childPanel;
}
}
Weitere Informationen über die logische Struktur finden Sie unter Strukturen in WPF.
Siehe auch
Konzepte
Optimieren der WPF-Anwendungsleistung
Optimieren der Leistung: Vorteile der Hardware nutzen
Optimieren der Leistung: 2D-Grafiken und Bildverarbeitung
Optimieren der Leistung: Objektverhalten
Optimieren der Leistung: Anwendungsressourcen
Optimieren der Leistung: Datenbindung