Performansı İyileştirme: 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.

Düzen

"Düzen geçişi" terimi, türetilmiş bir Panelnesnenin alt öğe koleksiyonunun üyelerini ölçme ve düzenleme ve ardından bunları ekranda çizme 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 alt UIElement nesne konumunu her değiştirişinde, düzen sistemi tarafından yeni bir geçiş tetikleme potansiyeline sahiptir. 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 alt üye için iki geçiş tamamlar: ölçü geçişi ve düzenleme geçişi. Her alt nesne, kendi özel düzen davranışını sağlamak için ve Arrange yöntemlerinin kendi geçersiz kılınan uygulamasını Measure 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 nesne, önce temel özelliklerini ölçerek düzen işlemine başlar.

  • Nesnenin FrameworkElement boyutla Heightilgili , ve Margingibi Widthözellikleri değerlendirilir.

  • Panel-specific mantığı, örneğin öğesinin DockDockPanelözelliği veya Orientation özelliğinin uygulanmasıdır StackPanel.

  • İçerik, tüm alt nesneler ölçüldükten sonra düzenlenir veya konumlandırılır.

  • Alt nesnelerin koleksiyonu ekrana çizilir.

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.

  • LayoutTransform alt nesneye uygulanır.

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

  • Ölçüyü veya düzenleme geçişlerini etkileyen meta verilerle işaretlenmiş bir bağımlılık özelliğinin değerinde bir değişiklik olduğunda.

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

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

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

RenderTransform Yerine Güncelleştir

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

Ağacınızı yukarıdan aşağıya derleme

Bir düğüm mantıksal ağaçtan eklendiğinde veya kaldırıldığında, düğümün üst öğesinde ve tüm alt öğelerinde özellik geçersizleştirmeleri oluşturulur. 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 tek ve her düzeyde 150 düzey derinliğinde TextBlockDockPanel olduğu yukarıdan aşağıya ve aşağıdan yukarıya doğru ağaç oluşturma arasındaki yürütme hızı farkı gösterilmektedir.

Eylem Ağaç bina (ms) İşleme—ağaç oluşturma (ms) içerir
Aşağıdan yukarıya 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 . WPF'deki Ağaçlar.

Ayrıca bkz.