Performansı İyileştirme: Uygulama Kaynakları

WPF, benzer türde öğeler arasında tutarlı bir görünümü veya davranışı destekleyebileceğiniz uygulama kaynaklarını paylaşmanıza olanak tanır. Bu konu, bu alanda uygulamalarınızın performansını artırmanıza yardımcı olabilecek birkaç öneri sağlar.

Kaynaklar hakkında daha fazla bilgi için bkz . XAML Kaynakları.

Kaynakları paylaşma

Uygulamanız özel denetimler kullanıyorsa ve bir ResourceDictionary (veya XAML Kaynakları düğümünde) kaynakları tanımlıyorsa, kaynakları Application veya Window nesne düzeyinde tanımlamanız veya bunları özel denetimler için varsayılan temada tanımlamanız önerilir. Özel denetimlerde kaynak tanımlamak, bu denetimin ResourceDictionary her örneği için performans etkisi oluşturur. Örneğin, özel denetimin kaynak tanımının bir parçası olarak tanımlanan yoğun performans gerektiren fırça işlemleriniz ve özel denetimin birçok örneği varsa, uygulamanın çalışma kümesi önemli ölçüde artar.

Bu noktayı göstermek için aşağıdakileri göz önünde bulundurun. WPF kullanarak bir kart oyunu geliştirdiğinizi varsayalım. Çoğu kart oyunu için 52 farklı yüzü olan 52 kart gerekir. Bir kart özel denetimi uygulamaya karar verirsiniz ve kart özel denetiminizin kaynaklarında 52 fırça (her biri bir kart yüzünü temsil eder) tanımlarsınız. Ana uygulamanızda başlangıçta bu kart özel denetiminin 52 örneğini oluşturursunuz. Kart özel denetiminin her örneği, uygulamanızda toplam 52 * 52 nesne sağlayan 52 Brush nesne örneği Brush oluşturur. Fırçaları kart özel denetim kaynaklarından veya Window nesne düzeyine Application taşıyarak veya özel denetim için varsayılan temada tanımlayarak, 52 fırçayı kart denetiminin 52 örneği arasında paylaştığınızdan uygulamanın çalışma kümesini azaltmış olursunuz.

Fırçayı Kopyalamadan Paylaşma

Aynı Brush nesneyi kullanan birden çok öğeniz varsa, fırçayı kaynak olarak tanımlayın ve XAML'de satır içi fırçayı tanımlamak yerine fırçaya başvurun. Bu yöntem bir örnek oluşturup yeniden kullanırken, XAML'de satır içi fırçaları tanımlamak her öğe için yeni bir örnek oluşturur.

Aşağıdaki işaretleme örneği bu noktayı gösterir:

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

Mümkün Olduğunda Statik Kaynakları Kullanma

Statik kaynak, önceden tanımlanmış bir kaynağa başvuru arayarak herhangi bir XAML özellik özniteliği için bir değer sağlar. Bu kaynak için arama davranışı, derleme zamanı aramasına benzer.

Öte yandan dinamik bir kaynak, ilk derleme sırasında geçici bir ifade oluşturur ve böylece bir nesne oluşturmak için istenen kaynak değeri gerçekten gerekli olana kadar kaynaklar için aramayı erteler. Bu kaynak için arama davranışı, performans etkisine neden olan çalışma zamanı aramasına benzer. Yalnızca gerektiğinde dinamik kaynakları kullanarak, uygulamanızda mümkün olduğunca statik kaynakları kullanın.

Aşağıdaki işaretleme örneği her iki kaynak türünün de kullanımını gösterir:

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

Ayrıca bkz.