Optimisation des performances : ressources d'application

WPF vous permet de partager des ressources d’application afin de pouvoir prendre en charge une apparence ou un comportement cohérents entre les éléments typés similaires. Cette rubrique fournit quelques recommandations dans ce domaine qui peuvent vous aider à améliorer les performances de vos applications.

Pour plus d’informations sur les ressources, consultez la page Ressources XAML.

Partage des ressources

Si votre application utilise des contrôles personnalisés et définit des ressources dans un ResourceDictionary (ou nœud Ressources XAML), il est recommandé de définir les ressources au niveau de l’objet Application ou Window de les définir dans le thème par défaut pour les contrôles personnalisés. La définition des ressources dans un contrôle ResourceDictionary personnalisé impose un impact sur les performances pour chaque instance de ce contrôle. Par exemple, si vous avez des opérations de pinceau nécessitant beaucoup de performances définies dans le cadre de la définition de ressource d’un contrôle personnalisé et de nombreuses instances du contrôle personnalisé, le jeu de travail de l’application augmente considérablement.

Pour illustrer ce point, tenez compte des éléments suivants. Supposons que vous développez un jeu carte à l’aide de WPF. Pour la plupart des jeux carte, vous avez besoin de 52 carte s avec 52 visages différents. Vous décidez d’implémenter un contrôle personnalisé carte et vous définissez 52 pinceaux (chacun représentant un visage carte) dans les ressources de votre contrôle personnalisé carte. Dans votre application principale, vous créez initialement 52 instances de ce contrôle personnalisé carte. Chaque instance du contrôle personnalisé carte génère 52 instances d’objetsBrush, ce qui vous donne un total de 52 * 52 Brush objets dans votre application. En déplaçant les pinceaux hors de la carte ressources de contrôle personnalisées au niveau de l’objet Application ou Window en les définissant dans le thème par défaut du contrôle personnalisé, vous réduisez le jeu de travail de l’application, car vous partagez maintenant les 52 pinceaux parmi 52 instances du contrôle carte.

Partage d’un pinceau sans copier

Si vous avez plusieurs éléments utilisant le même Brush objet, définissez le pinceau en tant que ressource et référencez-le, plutôt que de définir le pinceau inline en XAML. Cette méthode crée une instance et la réutilise, tandis que la définition de pinceaux inline en XAML crée une nouvelle instance pour chaque élément.

L’exemple de balisage suivant illustre ce point :

<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>

Utiliser des ressources statiques lorsque cela est possible

Une ressource statique fournit une valeur pour n’importe quel attribut de propriété XAML en recherchant une référence à une ressource déjà définie. Le comportement de recherche de cette ressource est analogue à la recherche au moment de la compilation.

Une ressource dynamique, d’autre part, crée une expression temporaire pendant la compilation initiale et reporte donc la recherche des ressources jusqu’à ce que la valeur de ressource demandée soit réellement nécessaire pour construire un objet. Le comportement de recherche de cette ressource est analogue à la recherche au moment de l’exécution, ce qui impose un impact sur les performances. Utilisez des ressources statiques chaque fois que cela est possible dans votre application, à l’aide de ressources dynamiques uniquement si nécessaire.

L’exemple de balisage suivant montre l’utilisation des deux types de ressources :

<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>

Voir aussi