Optymalizowanie wydajności: zasoby aplikacji
Platforma WPF umożliwia udostępnianie zasobów aplikacji, dzięki czemu można obsługiwać spójny wygląd lub zachowanie między podobnymi elementami. Ten temat zawiera kilka zaleceń w tym obszarze, które mogą pomóc w zwiększeniu wydajności aplikacji.
Aby uzyskać więcej informacji na temat zasobów, zobacz sekcję zasoby XAML.
Udostępnianie zasobów
Jeśli aplikacja używa kontrolek niestandardowych i definiuje zasoby w węźle ResourceDictionary (lub zasobach XAML), zaleca się zdefiniowanie zasobów na poziomie Application lub Window obiektu albo zdefiniowanie ich w domyślnym motywie kontrolek niestandardowych. Definiowanie zasobów w kontrolce niestandardowej ResourceDictionary wpływa na wydajność każdego wystąpienia tej kontrolki. Na przykład, jeśli masz operacje pędzla obciążające wydajność zdefiniowane w ramach definicji zasobów kontrolki niestandardowej i wiele jej wystąpień, pamięć robocza aplikacji znacznie się zwiększy.
Aby zilustrować ten punkt, rozważ następujące kwestie. Załóżmy, że opracowujesz grę kartową przy użyciu WPF. W przypadku większości gier kartowych potrzebujesz 52 kart z 52 różnymi twarzami. Decydujesz się zaimplementować niestandardową kontrolkę kart i definiujesz 52 pędzle (z których każdy reprezentuje awers karty) w zasobach tej kontrolki. W głównej aplikacji początkowo utworzysz 52 instancje niestandardowej kontrolki karty. Każde wystąpienie kontrolki niestandardowej karty generuje 52 wystąpienia obiektów Brush, co daje łącznie 52 razy 52 obiektów Brush w aplikacji. Przenosząc pędzle z zasobów niestandardowej kontrolki kart do poziomu Application lub Window obiektu albo definiując je w domyślnym motywie dla kontrolki niestandardowej, zmniejszasz ilość używanej pamięci aplikacji, ponieważ teraz współdzielisz 52 pędzli między 52 instancje kontrolki kart.
Udostępnianie pędzla bez kopiowania
Jeśli masz wiele elementów używających tego samego obiektu Brush, zdefiniuj pędzel jako zasób i odwołuj się do niego, zamiast definiowania pędzla inline w języku XAML. Ta metoda utworzy jedno wystąpienie i użyje go ponownie, podczas gdy definiowanie pędzli wbudowanych w języku XAML tworzy nowe wystąpienie dla każdego elementu.
Poniższy przykład kodu znaczników ilustruje ten punkt:
<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>
Użyj zasobów statycznych, gdy jest to możliwe
Zasób statyczny udostępnia wartość dla dowolnego atrybutu właściwości XAML, wyszukując odwołanie do już zdefiniowanego zasobu. Zachowanie wyszukiwania dla tego zasobu jest analogiczne do wyszukiwania w czasie kompilacji.
Z drugiej strony zasób dynamiczny utworzy wyrażenie tymczasowe podczas początkowej kompilacji, a tym samym odroczyć wyszukiwanie zasobów do momentu, gdy żądana wartość zasobu będzie rzeczywiście wymagana w celu utworzenia obiektu. Zachowanie wyszukiwania dla tego zasobu jest analogiczne do wyszukiwania w czasie wykonywania, co nakłada wpływ na wydajność. Używaj zasobów statycznych zawsze, gdy jest to możliwe w aplikacji, używając zasobów dynamicznych tylko wtedy, gdy jest to konieczne.
W poniższym przykładzie przedstawiono użycie obu typów zasobów:
<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>
Zobacz też
.NET Desktop feedback