パフォーマンスの最適化:アプリケーション リソースOptimizing Performance: Application Resources

WPFWPF 同様に型指定された要素の間で一貫性のある外観や動作をサポートできるように、アプリケーションのリソースを共有することができます。allows you to share application resources so that you can support a consistent look or behavior across similar-typed elements. このトピックでは、この領域に役立ついくつかの推奨事項が、アプリケーションのパフォーマンスを向上します。This topic provides a few recommendations in this area that can help you improve the performance of your applications.

リソースについて詳しくは、「XAML リソース」をご覧ください。For more information on resources, see XAML Resources.

リソースの共有Sharing resources

アプリケーションがカスタム コントロールを使用して、内のリソースを定義するかどうか、 ResourceDictionary (または XAML リソース ノード)、いずれかを定義することでリソースをお勧め、ApplicationまたはWindowオブジェクト レベル、またはの既定のテーマで定義しますカスタム コントロール。If your application uses custom controls and defines resources in a ResourceDictionary (or XAML Resources node), it is recommended that you either define the resources at the Application or Window object level, or define them in the default theme for the custom controls. カスタム コントロールのリソースを定義するResourceDictionaryでそのコントロールのすべてのインスタンスのパフォーマンスに影響が課せられます。Defining resources in a custom control's ResourceDictionary imposes a performance impact for every instance of that control. たとえば、カスタム コントロールのリソース定義の一部と、カスタム コントロールの多くのインスタンスとして定義されているブラシの負荷の高い操作では、場合によっては、アプリケーションのワーキング セットは大幅に長くなります。For example, if you have performance-intensive brush operations defined as part of the resource definition of a custom control and many instances of the custom control, the application's working set will increase significantly.

このポイントを示すためには、次のことを検討してください。To illustrate this point, consider the following. たとえば、カード ゲームを使用して、開発しているWPFWPFします。Let's say you are developing a card game using WPFWPF. ほとんどのカード ゲームでは、それぞれ異なる面を 52 枚のカードが必要です。For most card games, you need 52 cards with 52 different faces. カードのカスタム コントロールを実装して、カードのカスタム コントロールのリソースで (それぞれを表すカードの面) 52 のブラシを定義します。You decide to implement a card custom control and you define 52 brushes (each representing a card face) in the resources of your card custom control. メインのアプリケーションでは、最初にこのカードのカスタム コントロールの 52 のインスタンスを作成します。In your main application, you initially create 52 instances of this card custom control. カードのカスタム コントロールの各インスタンスの 52 のインスタンスを生成するBrush52 * 52 の合計を提供するオブジェクト、Brushアプリケーション内のオブジェクト。Each instance of the card custom control generates 52 instances of Brush objects, which gives you a total of 52 * 52 Brush objects in your application. カードのカスタム コントロールのリソースが不足ブラシを移動することによって、ApplicationまたはWindowオブジェクト レベル、または、カスタム コントロールの既定のテーマでの定義 52 ブラシを共有しているようになりましたので、アプリケーションのワーキング セットを削減します。カードのコントロールの 52 のインスタンス。By moving the brushes out of the card custom control resources to the Application or Window object level, or defining them in the default theme for the custom control, you reduce the working set of the application, since you are now sharing the 52 brushes among 52 instances of the card control.

コピーすることがなく、ブラシの共有Sharing a Brush without Copying

同じを使用して複数の要素があればBrushオブジェクトでブラシをリソースとして定義しではなく、ブラシにインラインで定義する参照XAMLXAMLします。If you have multiple elements using the same Brush object, define the brush as a resource and reference it, rather than defining the brush inline in XAMLXAML. このメソッドは 1 つのインスタンスが作成され、ブラシにインラインで定義する一方、再利用するXAMLXAMLの各要素の新しいインスタンスを作成します。This method will create one instance and reuse it, whereas defining brushes inline in XAMLXAML creates a new instance for each element.

次のマークアップ例では、この点を示します。The following markup sample illustrates this 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>

使用可能な場合は、静的なリソースUse Static Resources when Possible

静的リソースは、定義済みのリソースへの参照を検索することで、任意の XAML プロパティ属性の値を提供します。A static resource provides a value for any XAML property attribute by looking up a reference to an already defined resource. そのリソースの検索の動作は、コンパイル時参照に似ています。Lookup behavior for that resource is analogous to compile-time lookup.

動的リソースは、その一方で、最初のコンパイル中に一時的な式を作成を要求されたリソースの値が実際にオブジェクトを構築するために必要になるまで遅延リソースを参照します。A dynamic resource, on the other hand, will create a temporary expression during the initial compilation and thus defer lookup for resources until the requested resource value is actually required in order to construct an object. そのリソースの検索の動作は、パフォーマンスに影響は、実行時参照に似ています。Lookup behavior for that resource is analogous to run-time lookup, which imposes a performance impact. 必要な場合にのみ動的リソースを使用して、アプリケーションで可能な限り、静的なリソースを使用します。Use static resources whenever possible in your application, using dynamic resources only when necessary.

次のマークアップ例では、両方の種類のリソースの使用を示します。The following markup sample shows the use of both types of resources:

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

関連項目See also