Optimieren der Leistung: Anwendungsressourcen

Mit WPF können Sie Anwendungsressourcen freigeben, sodass Sie ein konsistentes Erscheinungsbild und Verhalten für alle Elemente eines ähnlichen Typs unterstützen können. Dieses Thema stellt einige Empfehlungen in diesem Bereich bereit, die Ihnen eine Hilfestellung bei der Verbesserung der Leistung für Ihre Anwendungen bieten.

Weitere Informationen zu Ressourcen finden Sie unter Übersicht über Ressourcen.

Freigeben von Ressourcen

Wenn die Anwendung benutzerdefinierte Steuerelemente verwendet und Ressourcen in einem ResourceDictionary (oder XAML-Ressourcenknoten) definiert, wird empfohlen, die Ressourcen entweder auf der Application-Objektebene oder auf der Window-Objektebene zu definieren oder diese im Standarddesign für die benutzerdefinierten Steuerelemente zu definieren. Eine Definition von Ressourcen im ResourceDictionary eines benutzerdefinierten Steuerelements hat negative Auswirkungen auf die Leistung für jede Instanz dieses Steuerelements. Wenn Sie beispielsweise leistungsintensive Pinselvorgänge als Teil der Ressourcendefinition eines benutzerdefinierten Steuerelements und vieler Instanzen des benutzerdefinierten Steuerelements definiert haben, wird das Workingset der Anwendung erheblich vergrößert.

Betrachten Sie zur Veranschaulichung dieses Punkts Folgendes. Angenommen, Sie möchten mit WPF ein Kartenspiel entwickeln. Für die meisten Kartenspiele benötigen Sie 52 Karten mit 52 verschiedenen Bildern. Sie entscheiden sich dafür, ein benutzerdefiniertes Kartensteuerelement zu implementieren, und Sie definieren 52 Pinsel (von denen jeder ein Kartenbild darstellt) in den Ressourcen des benutzerdefinierten Kartensteuerelements. In der Hauptanwendung erstellen Sie 52 Instanzen dieses benutzerdefinierten Kartensteuerelements. Jede Instanz des benutzerdefinierten Kartensteuerelements generiert 52 Instanzen von Brush-Objekten, sodass Sie insgesamt 52 * 52 Brush-Objekte in der Anwendung erhalten. Durch Verschieben der Pinsel aus den benutzerdefinierten Kartensteuerelementressourcen in die Application-Objektebene oder die Window-Objektebene, oder indem Sie diese im Standarddesign für das benutzerdefinierte Steuerelement definieren, verkleinern Sie das Workingset der Anwendung, da Sie jetzt 52 Pinsel innerhalb von 52 Instanzen des Kartensteuerelements freigeben.

Freigeben eines Pinsels ohne Kopieren

Wenn Sie über mehrere Elemente verfügen, die dasselbe Brush-Objekt verwenden, definieren Sie den Pinsel als Ressource und verweisen darauf, statt den Pinsel inline in XAML zu definieren. Diese Methode erstellt eine Instanz und verwendet diese erneut, während durch das Definieren von Pinseln inline in XAML für jedes Element eine neue Instanz erstellt wird.

Im folgenden Markupbeispiel wird dieser Punkt veranschaulicht:

<StackPanel.Resources>
  <LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
    <LinearGradientBrush.GradientStops>
      <GradientStopCollection>
        <GradientStop Color="GoldenRod" Offset="0" />
        <GradientStop Color="White" Offset="1" />
      </GradientStopCollection>
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
</StackPanel.Resources>

<!-- Non-shared Brush object. -->
<Label>
  Label 1
  <Label.Background>
    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Color="GoldenRod" Offset="0" />
          <GradientStop Color="White" Offset="1" />
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Label.Background>
</Label>

<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>

Verwenden von statischen Ressourcen, sofern möglich

Eine statische Ressource stellt einen Wert für ein beliebiges XAML-Eigenschaftenattribut bereit, indem nach einem Verweis auf eine bereits definierte Ressource gesucht wird. Das Suchverhalten für diese Ressource ist analog zur Suche nach der Kompilierungszeit.

Andererseits erstellt eine dynamische Ressource während der erstmaligen Kompilierung einen temporären Ausdruck und schiebt daher die Suche nach Ressourcen auf, bis der angeforderte Ressourcenwert tatsächlich erforderlich ist, um ein Objekt zu konstruieren. Das Suchverhalten für diese Ressource ist analog zu Laufzeitsuche, die Auswirkungen auf die Leistung erzwingt. Verwenden Sie möglichst immer statische Ressourcen in der Anwendung. Dynamische Ressourcen sollten Sie nur dann verwenden, wenn dies notwendig ist.

In dem folgenden Markupbeispiel wird die Verwendung beider Typen von Ressourcen veranschaulicht:

<StackPanel.Resources>
  <SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>

<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>

<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>

Siehe auch

Konzepte

Optimieren der WPF-Anwendungsleistung

Planen der Anwendungsleistung

Optimieren der Leistung: Vorteile der Hardware nutzen

Optimieren der Leistung: Layout und Entwurf

Optimieren der Leistung: 2D-Grafiken und Bildverarbeitung

Optimieren der Leistung: Objektverhalten

Optimieren der Leistung: Text

Optimieren der Leistung: Datenbindung

Optimieren der Leistung: Weitere Empfehlungen