Performansı İyileştirme: Nesne Davranışı
WPF nesnelerinin iç davranışını anlamak, işlevsellik ve performans arasındaki doğru avantajları yapmanıza yardımcı olur.
Nesneler üzerinde olay Işleyicilerini kaldırma, nesneleri canlı tutmaya devam edebilir
Bir nesnenin olayına geçirdiği temsilci, bu nesneye etkin bir şekilde başvurur. Bu nedenle, olay işleyicileri nesneleri beklenenden uzun süre canlı tutabilirler. Bir nesnenin olayını dinlemek için kayıtlı olan bir nesnenin temizlenmesini gerçekleştirirken, nesneyi serbest bırakmadan önce o temsilciyi kaldırmak önemlidir. Gereksiz nesnelerin canlı tutulması, uygulamanın bellek kullanımını artırır. Nesne bir mantıksal ağacın veya görsel ağacın kökü olduğunda bu özellikle doğrudur.
WPF, kaynak ve dinleyici arasındaki nesne ömrü ilişkilerinin izlemek zor olduğu durumlarda yararlı olabilecek olaylar için zayıf bir olay dinleyicisi deseninin kullanımını sağlar. Mevcut bazı WPF olayları bu kalıbı kullanır. Özel olaylar içeren nesneler uyguladığınızda, bu model sizin için kullanılabilir. Ayrıntılar için bkz. zayıf olay desenleri.
CLR Profiler ve çalışma kümesi Görüntüleyicisi gibi çeşitli araçlar vardır. Bu, belirtilen bir işlemin bellek kullanımı hakkında bilgi sağlar. CLR Profiler, ayrılan türlerin bir histogramı, ayırma ve çağrı grafikleri, çeşitli nesiller için çöp koleksiyonları ve bu koleksiyonlardan sonra yönetilen yığının elde edilen durumunu gösteren zaman çizgisi ve yöntem başına ayırmaları ve derleme yüklerini gösteren bir çağrı ağacı dahil olmak üzere ayırma profilinin çok sayıda faydalı görünümünü içerir. Daha fazla bilgi için bkz. performans.
Bağımlılık özellikleri ve nesneler
Genel olarak, bir bağımlılık özelliğine erişim bir DependencyObject clr özelliğine erişmekten daha yavaş değildir. Bir özellik değerini ayarlamaya yönelik küçük bir performans yükü olsa da, bir değeri almak bir CLR özelliğinden değer elde etmek kadar hızlıdır. Küçük performans yükünün mahsuplanması, bağımlılık özelliklerinin veri bağlama, animasyon, devralma ve stil oluşturma gibi güçlü özellikleri desteklemesidir. Daha fazla bilgi için bkz. bağımlılık özelliklerine genel bakış.
DependencyProperty Iyileştirmeleri
Uygulamanızda bağımlılık özelliklerini dikkatle tanımlamanız gerekir. Gibi DependencyProperty diğer meta veri seçenekleri yerine yalnızca işleme türü meta veri seçeneklerini etkiliyorsa AffectsMeasure , meta verilerini geçersiz kılarak bu şekilde işaretlemeniz gerekir. Özellik meta verilerini geçersiz kılma veya alma hakkında daha fazla bilgi için bkz. bağımlılık özelliği meta verileri.
Tüm özellik değişiklikleri ölçü, düzenleme ve işlemeyi etkilemediği takdirde, bir özellik değişikliği işleyicisinin ölçüyü, düzenlemeyi ve işlemeyi el ile geçersiz kılması daha verimli olabilir. Örneğin, bir arka planı yalnızca bir değer ayarlanan sınırdan daha büyük olduğunda yeniden işlemeye karar verebilirsiniz. Bu durumda, özellik değişikliği işleyiciniz yalnızca değer ayarlanan sınırı aştığında işlemeyi geçersiz kılar.
DependencyProperty devralınabilir hale getirme işlemi ücretsizdir
Varsayılan olarak, kayıtlı bağımlılık özellikleri devralınamaz. Ancak, herhangi bir özelliği açıkça devralınabilir yapabilirsiniz. Bu kullanışlı bir özellik olsa da, bir özelliğin devralınabilir olarak dönüştürülmesi, özellik geçersiz kılma süresini artırarak performansı etkiler.
RegisterClassHandler 'i dikkatle kullanın
Çağırma işlemi, RegisterClassHandler örnek durumlarınızı kaydetmenize izin verdiğinden, işleyicinin her örnekte çağrıldığından, performans sorunlarına neden olabilecek şekilde farkında olmak önemlidir. Yalnızca RegisterClassHandler uygulamanızın örnek durumunu kaydetmenizi gerektirdiğinde kullanın.
Kayıt sırasında DependencyProperty için varsayılan değeri ayarlama
DependencyPropertyVarsayılan değer gerektiren bir oluştururken, bir parametresi olarak geçirilen varsayılan meta verileri kullanarak değerini ayarlayın RegisterDependencyProperty . Bir oluşturucuda veya bir öğenin her örneğindeki özellik değerini ayarlamak yerine bu tekniği kullanın.
Register kullanarak PropertyMetadata değerini ayarlama
Bir oluştururken, DependencyProperty ya da yöntemlerini kullanarak ayarlama seçeneğiniz vardır PropertyMetadataRegisterOverrideMetadata . Nesneniz çağırmak için bir statik oluşturucuya sahip olsa da OverrideMetadata , bu en iyi çözüm değildir ve performansı etkiler. En iyi performans için, PropertyMetadata çağrısı sırasında öğesini ayarlayın Register .
Freezable nesneleri
Freezable, İki durumu olan özel bir nesne türüdür: dondurulmamış ve dondurulmuş. Mümkün olduğunda nesneleri dondurmak, uygulamanızın performansını geliştirir ve çalışma kümesini azaltır. Daha fazla bilgi için bkz. Freezable nesnelerine genel bakış.
Her birinin her FreezableChanged değişiklik yapıldığında oluşan bir olayı vardır. Ancak, değişiklik bildirimleri uygulama performansı açısından maliyetlidir.
Her birinin aynı nesneyi kullandığı aşağıdaki örneği göz önünde bulundurun RectangleBrush :
rectangle_1.Fill = myBrush;
rectangle_2.Fill = myBrush;
rectangle_3.Fill = myBrush;
// ...
rectangle_10.Fill = myBrush;
rectangle_1.Fill = myBrush
rectangle_2.Fill = myBrush
rectangle_3.Fill = myBrush
' ...
rectangle_10.Fill = myBrush
WPF, varsayılan olarak nesnenin SolidColorBrushChanged özelliğini geçersiz kılmak için nesnenin olayına bir olay işleyicisi sağlar RectangleFill . Bu durumda, her seferinde olayını her SolidColorBrush tetiklemesi gerektiğinde, ChangedRectangle Bu geri çağırma işlevinin birikmesi, önemli bir performans cezası uygular. Buna ek olarak, bu noktada işleyicileri eklemek ve kaldırmak çok performansa sahiptir çünkü uygulamanın tüm listeyi gezmeleri gerekir. Uygulama senaryonuz hiçbir şekilde hiçbir şekilde değişiklik görmüyorsa SolidColorBrush , Changed etkinlik işleyicilerinin gereksiz bir şekilde sürdürülmesi için ücret ödeirsiniz.
FreezableDeğişiklik bildirimlerinin korunmasıyla ilgili kaynakları daha iyi bir şekilde almak zorunda olmadığından, bir değişikliği sürdürmek, performansını iyileştirebilir. Aşağıdaki tabloda SolidColorBrushIsFrozen , özelliği özelliği olarak ayarlandığında true , ne zaman olduğu ile karşılaştırıldığında bir basit öğesinin boyutu gösterilmektedir. Bu, on nesnenin özelliğine bir fırça uygulayan olduğunu varsayar FillRectangle .
| Durum | Boyut |
|---|---|
| Lamadığı SolidColorBrush | 212 bayt |
| Dondurulmuş olmayan SolidColorBrush | 972 bayt |
Aşağıdaki kod örneği bu kavramı göstermektedir:
Brush frozenBrush = new SolidColorBrush(Colors.Blue);
frozenBrush.Freeze();
Brush nonFrozenBrush = new SolidColorBrush(Colors.Blue);
for (int i = 0; i < 10; i++)
{
// Create a Rectangle using a non-frozed Brush.
Rectangle rectangleNonFrozen = new Rectangle();
rectangleNonFrozen.Fill = nonFrozenBrush;
// Create a Rectangle using a frozed Brush.
Rectangle rectangleFrozen = new Rectangle();
rectangleFrozen.Fill = frozenBrush;
}
Dim frozenBrush As Brush = New SolidColorBrush(Colors.Blue)
frozenBrush.Freeze()
Dim nonFrozenBrush As Brush = New SolidColorBrush(Colors.Blue)
For i As Integer = 0 To 9
' Create a Rectangle using a non-frozed Brush.
Dim rectangleNonFrozen As New Rectangle()
rectangleNonFrozen.Fill = nonFrozenBrush
' Create a Rectangle using a frozed Brush.
Dim rectangleFrozen As New Rectangle()
rectangleFrozen.Fill = frozenBrush
Next i
Dondurulmamış Freezable nesneleri üzerinde değiştirilen Işleyiciler nesneleri canlı tutamayabilir
Bir nesnenin bir nesnenin olayına geçirdiği temsilci, FreezableChanged Bu nesneye etkin bir şekilde başvurur. Bu nedenle, Changed olay işleyicileri nesneleri beklenenden uzun süre canlı tutabilirler. Bir nesnenin olayını dinlemek için kayıtlı olan bir nesnenin temizlenmesini gerçekleştirirken FreezableChanged , nesneyi serbest bırakmadan önce o temsilciyi kaldırmak önemlidir.
WPF ayrıca Changed olayları dahili olarak takar. Örneğin, bir değer olarak kullanan tüm bağımlılık özellikleri, FreezableChanged olayları otomatik olarak dinler. ' I Fill alan özelliği Brush Bu kavramı gösterir.
Brush myBrush = new SolidColorBrush(Colors.Red);
Rectangle myRectangle = new Rectangle();
myRectangle.Fill = myBrush;
Dim myBrush As Brush = New SolidColorBrush(Colors.Red)
Dim myRectangle As New Rectangle()
myRectangle.Fill = myBrush
' A atama üzerinde myBrushmyRectangle.Fill , nesnesine geri işaret eden bir temsilci RectangleSolidColorBrush nesnenin olayına eklenecektir Changed . Bu, aşağıdaki kodun gerçekte myRect çöp toplama için uygun hale getirmediği anlamına gelir:
myRectangle = null;
myRectangle = Nothing
Bu durumda myBrush , hala etkin olmaya devam eder myRectangle ve olayını harekete çağırdığınızda geri çağırır Changed . myBrushFill Yeni bir özelliğine atama, ' Rectangle ye yalnızca başka bir olay işleyicisi ekleneceğini unutmayın myBrush .
Bu nesne türlerini temizlemek için önerilen yol, BrushFill özelliği içinden kaldırılacağından Changed olay işleyicisini de kaldırır.
myRectangle.Fill = null;
myRectangle = null;
myRectangle.Fill = Nothing
myRectangle = Nothing
Kullanıcı arabirimi sanallaştırma
WPF ayrıca, StackPanel veri bağlantılı alt içeriği otomatik olarak "sanallaştırın" bir öğe çeşitlemesi sağlar. Bu bağlamda, sanalbir sözcük, nesnelerin bir alt kümesinin ekranda görünür olduğu çok sayıda veri öğesinden oluşturulduğu bir tekniğe başvurur. Belirli bir zamanda ekranda yalnızca birkaç tane olabilir, çok sayıda UI öğesi oluşturmak için hem bellek hem de işlemci bakımından yoğun bir şekilde yoğundur. VirtualizingStackPanel (tarafından sunulan işlevleri aracılığıyla VirtualizingPanel ) görünür öğeleri hesaplar ve ' ItemContainerGenerator den (veya gibi) ile birlikte çalışarak ItemsControlListBoxListView yalnızca görünür öğeler için öğeleri oluşturun.
Performans iyileştirmesi olarak, bu öğelerin görsel nesneleri yalnızca ekranda görünür durumdaysa oluşturulur veya etkin tutulur. Artık denetimin görüntülenebilir alanında olmadığında görsel nesneler kaldırılabilir. Bu, veri nesnelerinin, gerekli olduğu gibi akan şekilde yerel koleksiyonda bulunmadığı veri sanallaştırmayla karıştırılmamalıdır.
Aşağıdaki tabloda, bir ve ' a 5000 öğeleri ekleme ve işleme geçen süre gösterilmektedir TextBlockStackPanelVirtualizingStackPanel . Bu senaryoda ölçümler, bir nesnenin özelliğine metin dizesi ekleme arasındaki süreyi, ItemsSourceItemsControl panel öğelerinin metin dizesini görüntülemesi için zaman gösterir.
| Ana bilgisayar paneli | İşleme süresi (MS) |
|---|---|
| StackPanel | 3210 |
| VirtualizingStackPanel | 46 |