Ottimizzazione delle prestazioni: risorse di applicazioni
In WPF è possibile condividere risorse di applicazioni per garantire un aspetto o un comportamento coerente in elementi di tipi simili. In questo argomento vengono forniti alcuni consigli che possono agevolare il miglioramento delle prestazioni delle applicazioni.
Per ulteriori informazioni sulle risorse, vedere Cenni preliminari sulle risorse.
Condivisione delle risorse
Se nell'applicazione vengono utilizzati controlli personalizzati e vengono definite risorse in un oggetto ResourceDictionary (o nodo di risorse XAML), è consigliabile definire le risorse a livello dell'oggetto Application o Window oppure definirle nel tema predefinito per i controlli personalizzati. La definizione delle risorse nell'oggetto ResourceDictionary di un controllo personalizzato comporta un impatto sulle prestazioni per ogni istanza di tale controllo. Ad esempio, se sono presenti operazioni di pennello che richiedono prestazioni elevate definite come parte della definizione delle risorse di un controllo personalizzato e numerose istanze del controllo personalizzato, il working set dell'applicazione aumenta in misura significativa.
Per illustrare questo punto, si consideri quanto segue. Si supponga di sviluppare un gioco di carte tramite WPF. Nella maggior parte dei giochi di carte, sono necessarie 52 carte con 52 facce diverse. Si decide di implementare un controllo personalizzato delle carte e si definiscono 52 pennelli (ognuno dei quali rappresenta una faccia delle carte) nelle risorse del controllo personalizzato delle carte. Nell'applicazione principale, si creano inizialmente 52 istanze di tale controllo personalizzato. Ogni istanza del controllo personalizzato delle carte genera 52 istanze di oggetti Brush, per un totale di 52 * 52 oggetti Brush nell'applicazione. Spostando i pennelli all'esterno delle risorse del controllo personalizzato delle carte, a livello dell'oggetto Application o Window, oppure definendole nel tema predefinito del controllo personalizzato, si riduce il working set dell'applicazione, poiché si condividono i 52 pennelli tra 52 istanze del controllo delle carte.
Condivisione di un pennello senza copia
Se sono presenti più elementi che utilizzano lo stesso oggetto Brush, definire il pennello come risorsa e fare riferimento a esso, anziché definire il pennello inline in XAML. Con questo metodo viene creata un'istanza che è possibile riutilizzare, mentre con la definizione di pennelli inline in XAML viene creata una nuova istanza per ogni elemento.
Nell'esempio di markup riportato di seguito viene illustrato 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>
Utilizzare risorse statiche quando possibile
Una risorsa statica fornisce un valore per qualsiasi attributo di proprietà XAML eseguendo la ricerca di un riferimento a una risorsa già definita. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di compilazione.
Con una risorsa dinamica, invece, viene creata un'espressione temporanea durante la compilazione iniziale, e la ricerca delle risorse viene rinviata finché il valore della risorsa richiesta non risulta effettivamente necessario per costruire un oggetto. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di esecuzione, che comporta un impatto sulle prestazioni. Quando possibile, utilizzare risorse statiche nell'applicazione, limitando l'utilizzo delle risorse dinamiche solo ai casi in cui è necessario.
Nell'esempio di markup riportato di seguito viene illustrato l'utilizzo 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>
Vedere anche
Concetti
Ottimizzazione delle prestazioni di applicazioni WPF
Pianificazione delle prestazioni dell'applicazione
Ottimizzazione delle prestazioni: sfruttare appieno l'hardware
Ottimizzazione delle prestazioni: layout e progettazione
Ottimizzazione delle prestazioni: grafica bidimensionale e creazione di immagini
Ottimizzazione delle prestazioni: comportamento degli oggetti
Ottimizzazione delle prestazioni: testo