パフォーマンスの最適化: アプリケーション リソース
WPF を使用すると、似た型の要素間で一貫した外観や動作をサポートできるように、アプリケーション リソースを共有できます。 このトピックでは、アプリケーションのパフォーマンス向上に役立つ推奨事項をいくつか紹介します。
リソースの詳細については、「XAML リソース」を参照してください。
リソースの共有
アプリケーションでカスタム コントロールを使用し、ResourceDictionary (または XAML リソース) ノードでリソースを定義する場合は、Application または Window オブジェクト レベルでリソースを定義するか、カスタム コントロールの既定のテーマでそれらを定義することをお勧めします。 カスタム コントロールの ResourceDictionary でリソースを定義すると、そのコントロールのすべてのインスタンスにパフォーマンスへの影響が生じます。 たとえば、カスタム コントロールのリソース定義の一部として定義されたパフォーマンス集中型のブラシ操作と、カスタム コントロールの多くのインスタンスがある場合、アプリケーションのワーキング セットは大幅に増加します。
この点を説明するために、次の点を考慮してください。 たとえば、WPF を使用してカード ゲームを開発しているとします。 ほとんどのカード ゲームでは、52 種類の顔を持つ 52 枚のカードが必要です。 カード カスタム コントロールを実装することにし、カード カスタム コントロールのリソースに 52 個のブラシ (それぞれカードの顔を表す) を定義します。 メイン アプリケーションでは、最初にこのカード カスタム コントロールのインスタンスを 52 個作成します。 カード カスタム コントロールの各インスタンスは、Brush オブジェクトの 52 個のインスタンスを生成し、アプリケーションで合計 52 * 52 Brush オブジェクトを生成します。 カード カスタム コントロール リソースから Application または Window オブジェクト レベルにブラシを移動するか、カスタム コントロールの既定のテーマで定義することで、カード コントロールの 52 個のインスタンス間で 52 個のブラシを共有するため、アプリケーションのワーキング セットを減らすことができます。
コピーせずにブラシを共有する
同じ Brush オブジェクトを使用する複数の要素がある場合は、XAML でブラシをインラインで定義するのではなく、ブラシをリソースとして定義して参照します。 このメソッドは 1 つのインスタンスを作成して再利用しますが、XAML でブラシをインラインで定義すると、要素ごとに新しいインスタンスが作成されます。
次のマークアップ サンプルは、この点を示しています。
<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>
可能な場合は静的リソースを使用する
静的リソースは、既に定義されているリソースへの参照を検索することによって、XAML プロパティ属性の値を提供します。 そのリソースの参照動作は、コンパイル時の参照に似ています。
一方、動的リソースは、最初のコンパイル中に一時式を作成するため、オブジェクトを構築するために要求されたリソース値が実際に必要になるまでリソースの検索を延期します。 そのリソースの参照動作は、実行時の参照に似ています。このため、パフォーマンスに影響が及びます。 アプリケーションで可能な限り静的リソースを使用し、必要な場合にのみ動的リソースを使用します。
次のマークアップ サンプルは、両方の種類のリソースの使用を示しています。
<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>
参照
- WPF アプリケーションパフォーマンス の最適化
- アプリケーション パフォーマンス の
計画 - ハードウェアを活用する
- レイアウトとデザイン
- 2D グラフィックスおよびイメージング
- オブジェクトの動作
- テキスト
- データ バインディング
- その他の性能に関する推奨事項
.NET Desktop feedback