Dil

Performansı İyi hale getirme: Düzen ve Tasarım

WPF uygulamanızın tasarımı, düzen hesaplama ve nesne başvurularını doğrulama konusunda gereksiz ek yük oluşturarak performansını etkileyebilir. Özellikle çalışma zamanında nesnelerin oluşturulması uygulamanızın performans özelliklerini etkileyebilir.

Bu konu, bu alanlarda performans önerileri sağlar.

Tasarım Düzeni

"Düzen geçişi" terimi, Paneltüretilmiş bir nesnenin alt öğe koleksiyonunun üyelerini ölçme ve yerleştirme süreçlerini, ve sonrasında bunların ekranda çizilmesi işlemini açıklar. Düzen geçişi matematiksel açıdan yoğun bir işlemdir; koleksiyondaki alt öğe sayısı ne kadar fazlaysa, gereken hesaplama sayısı da o kadar fazladır. Örneğin, koleksiyondaki bir çocuk UIElement nesnesi her konum değiştirdiğinde, düzen sistemi tarafından yeni bir geçişin tetiklenme potansiyeli bulunur. Nesne özellikleri ve düzen davranışı arasındaki yakın ilişki nedeniyle, düzen sistemini çağırabilecek olayların türünü anlamak önemlidir. Uygulamanız, düzen geçişinin gereksiz çağrılarını mümkün olduğunca azaltarak daha iyi performans gösterir.

Düzen sistemi, bir koleksiyondaki her bir alt üye için iki geçiş tamamlar: ölçüm geçişi ve düzenleme geçişi. Her bir alt nesne, kendi özel yerleşim davranışını sağlamak için Measure ve Arrange yöntemlerinin kendi geçersiz kılınmış uygulamasını sağlar. En basiti düzen, bir öğenin boyutlandırılmasını, konumlandırılmasını ve ekranda çizilmesini sağlayan özyinelemeli bir sistemdir.

  • Alt UIElement nesnesi, önce temel özelliklerini ölçerek düzen işlemine başlar.

  • Nesnenin FrameworkElement, Widthve Heightgibi boyutla ilgili Margin özellikleri değerlendirilir.

  • Panel'e özgü mantık, Dock'nin DockPanel özelliği veya Orientation'ün StackPanel özelliği gibi durumlarda uygulanır.

  • Tüm alt nesneler ölçüldükten sonra içerik düzenlenir veya konumlandırılır.

  • Çocuk nesnelerin koleksiyonu ekranda görünür.

Aşağıdaki eylemlerden herhangi biri gerçekleşirse düzen geçişi işlemi yeniden çağrılır:

  • Koleksiyona bir alt nesne eklenir.

  • Alt öğeye bir LayoutTransform uygulanır.

  • çocuk nesne için UpdateLayout yöntemi çağrılır.

  • Meta veriler kullanılarak ölçüm veya düzenleme işlemlerini etkileyen bir bağımlılık özelliğinin değeri değiştiğinde.

Mümkün Olduğunda En Verimli Paneli Kullanma

Düzen işleminin karmaşıklığı doğrudan kullandığınız Paneltüretilmiş öğelerin düzen davranışına bağlıdır. Örneğin, bir Grid veya StackPanel denetimi, Canvas denetiminden çok daha fazla işlevsellik sağlar. İşlevsellikteki bu artışın fiyatı, performans maliyetlerinde daha yüksek bir artıştır. Ancak, bir Grid denetiminin sağladığı işlevlere ihtiyacınız yoksa, Canvas veya özel panel gibi daha düşük maliyetli alternatifleri kullanmanız gerekir.

Daha fazla bilgi için bkz. Panellere Genel Bakış.

RenderTransform'u Değiştirmek Yerine Güncelleştir

Bir Transform'ı, bir RenderTransform özelliğinin değeri olarak değiştirmek yerine güncelleyebilirsiniz. Bu özellikle animasyon içeren senaryolarda geçerlidir. Mevcut bir Transformgüncelleştirerek, gereksiz bir düzen hesaplaması başlatmaktan kaçınabilirsiniz.

Ağacınızı oluşturma Top-Down

Bir düğüm mantıksal ağaçtan eklendiğinde veya kaldırıldığında, düğümün ana öğesinde ve tüm alt öğelerinde özellik geçersizliği başlatılır. Sonuç olarak, önceden doğrulanmış düğümlerde gereksiz geçersiz kılınmaların maliyetini önlemek için her zaman yukarıdan aşağıya bir yapı deseni izlenmelidir. Aşağıdaki tabloda, ağacın 150 seviyeli olduğu ve her seviyede yalnızca bir TextBlock ve DockPanel bulunduğu durumda, yukarıdan aşağıya karşı aşağıdan yukarıya oluşturma arasındaki yürütme hızı farkı gösterilmektedir.

Eylem Ağaç oluşturma (ms cinsinden) Render— ağaç oluşturma (ms) süresini içerir
Alttan yukarı 366 454
Yukarıdan aşağıya 11 96

Aşağıdaki kod örneğinde yukarıdan aşağıya bir ağacın nasıl oluşturulacağı gösterilmektedir.

private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();
    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);
    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)
    {
        textBlock = new TextBlock();
        textBlock.Text = "Default";
        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();
        parentPanel.Children.Add(childPanel);
        parentPanel = childPanel;
    }
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim textBlock As New TextBlock()
    textBlock.Text = "Default"

    Dim parentPanel As New DockPanel()
    Dim childPanel As DockPanel

    myCanvas.Children.Add(parentPanel)
    myCanvas.Children.Add(textBlock)

    For i As Integer = 0 To 149
        textBlock = New TextBlock()
        textBlock.Text = "Default"
        parentPanel.Children.Add(textBlock)

        childPanel = New DockPanel()
        parentPanel.Children.Add(childPanel)
        parentPanel = childPanel
    Next i
End Sub

Mantıksal ağaç hakkında daha fazla bilgi için bkz. WPFAğaçları.

Ayrıca bakınız