Ottimizzazione delle prestazioni: risorse di applicazioni

WPF consente di condividere le risorse dell'applicazione in modo che sia possibile supportare un aspetto o un comportamento coerente tra elementi tipizzato simili. In questo argomento vengono fornite alcune raccomandazioni in questa area che consentono di migliorare le prestazioni delle applicazioni.

Per altre informazioni sulle risorse, vedere Risorse XAML.

Condivisione delle risorse

Se l'applicazione usa controlli personalizzati e definisce le risorse in un ResourceDictionary nodo (o risorse XAML), è consigliabile definire le risorse a Application livello di oggetto o Window oppure definirle nel tema predefinito per i controlli personalizzati. La definizione delle risorse in un controllo ResourceDictionary personalizzato impone un impatto sulle prestazioni per ogni istanza di tale controllo. Ad esempio, se sono presenti operazioni pennello a elevato utilizzo di prestazioni definite come parte della definizione della risorsa di un controllo personalizzato e molte istanze del controllo personalizzato, il working set dell'applicazione aumenterà in modo significativo.

Per illustrare questo punto, considerare quanto segue. Si supponga di sviluppare un gioco di carte usando WPF. Per la maggior parte dei giochi di carte, hai bisogno di 52 carte con 52 facce diverse. Si decide di implementare un controllo personalizzato della scheda e si definiscono 52 pennelli (ognuno che rappresenta una faccia scheda) nelle risorse del controllo personalizzato della scheda. Nell'applicazione principale vengono inizialmente create 52 istanze di questo controllo personalizzato della scheda. Ogni istanza del controllo personalizzato della scheda genera 52 istanze di Brush oggetti, che offrono un totale di 52 * 52 Brush oggetti nell'applicazione. Spostando i pennelli dalle risorse del controllo personalizzato della scheda al Application livello di oggetto o Window o definendoli nel tema predefinito per il controllo personalizzato, si riduce il working set dell'applicazione, poiché ora si condividono i 52 pennelli tra 52 istanze del controllo scheda.

Condivisione di un pennello senza copia

Se sono presenti più elementi che usano lo stesso Brush oggetto, definire il pennello come risorsa e farvi riferimento, anziché definire il pennello inline in XAML. Questo metodo creerà un'istanza e la riutilizzerà, mentre la definizione dei pennelli inline in XAML crea una nuova istanza per ogni elemento.

L'esempio di markup seguente illustra questo punto:

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

Usare le risorse statiche quando possibile

Una risorsa statica fornisce un valore per qualsiasi attributo di proprietà XAML cercando un riferimento a una risorsa già definita. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di compilazione.

Una risorsa dinamica, d'altra parte, crea un'espressione temporanea durante la compilazione iniziale e quindi rinvia la ricerca delle risorse fino a quando il valore della risorsa richiesto non è effettivamente necessario per costruire un oggetto. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di esecuzione, che impone un impatto sulle prestazioni. Usare le risorse statiche quando possibile nell'applicazione, usando risorse dinamiche solo quando necessario.

L'esempio di markup seguente illustra l'uso di entrambi i tipi di risorse:

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

Vedi anche