WPF - 性能優化
- WPF性能優化一 - Rendering Tier
- 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情況請特別注意,因為在這些情況下,即使是處于Rendering Tier 2的情況下也不會硬件加速。(不全,其余請查閱SDK)
- WPF性能優化二 - 布局和設計
- 盡量多使用Canvas等簡單的布局元素,少使用Grid或者StackPanel等復雜的,越復雜性能開銷越大。
- 建立邏輯樹或者視覺樹的時候,遵循Top-Down的原則。
- WPF性能優化三 - 圖像
- 對Image做動畫處理的時候(如調整大小等),可以使用這條語句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。
- 用TileBrush的時候,可以CachingHint。
- WPF性能優化四 - 對象行為
- 訪問CLR對象和CLR屬性的效率會比訪問DependencyObject/DependencyProperty高。注意這里指的是訪問,不要和前面的綁定混淆了。但是,把屬性注冊為DependencyProperty會有很多的優點:比如繼承、數据綁定和Style。
- WPF性能優化五 - 應用程序資源
- 在自定義控件,盡量不要在控件的ResourceDictionary定義資源,而應該放在Window或者Application級。因為放在控件中會使每個實例都保留一份資源的拷貝。
- 盡量使用Static Resources,但不能盲目使用。
- WPF性能優化六 - 文本
- 文字少的時候用TextBlock或者label,長的時候用FlowDocument.
- 使用元素TextFlow和TextBlock時,如果不需要TextFlow的某些特性,就應該考慮使用TextBlock,因為它的效率更高。
- 在TextFlow中使用UIElement(比如TextBlock)所需的代价要比使用TextElement(比如Run)的代价高.在FlowDocument中盡量避免使用TextBlock,要用Run替代。
- 在TextBlock中顯式的使用Run命令比不使用Run命名的代碼要高。
- 把Label(標簽)元素的ContentProperty和一個字符串(String)綁定的效率要比把字符串和TextBlock的Text屬性綁定的效率低。因為Label在更新字符串是會丟棄原來的字符串,全部重新顯示內容。如果字符串不需要更新,用Label就無所謂性能問題。
- 在TextBlock塊使用HyperLinks時,把多個HyperLinks組合在一起效率會更高。
- 顯示超鏈接的時候,盡量只在IsMouseOver為True的時候顯示下划線,一直顯示下划線的代碼高很多
- 盡量不使用不必要的字符串連接。
- WPF性能優化七 - 數据綁定
- 在使用數据綁定的過程中,如果綁定的數据源是一個CLR對象,屬性也是一個CLR屬性,那麼在綁定的時候對象CLR對象所實現的机制不同,綁定的效率也不同。
- 數据源是一個CLR對象,屬性也是一個CLR屬性。對象通過TypeDescriptor/PropertyChanged模式實現通知功能。此時綁定引擎用TypeDescriptor來反射源對象。效率最低。
- 數据源是一個CLR對象,屬性也是一個CLR屬性。對象通過INotifyPropertyChanged實現通知功能。此時綁定引擎直接反射源對象。效率稍微提高。
- 數据源是一個DependencyObject,而且屬性是一個DependencyProperty。此時不需要反射,直接綁定。效率最高。
- 當一個CLR對象很大時,比如有1000個屬性時,盡量把這個對象分解成很多很小的CLR對象。比如分成1000個只有一個屬性的CLR對象。
當我們在列表(比如ListBox)顯示了一個CLR對象列表(比如List)時,如果想在修改List對象后,ListBox也動態的反映這種變化。此時,我們應該使用動態的ObservableCollection對象綁定。而不是直接的更新ItemSource。兩者的區別在于直接更新ItemSource會使WPF拋棄ListBox已有的所有數据,然后全部重新從List加載。而使用ObservableCollection可以避免這種先全部刪除再重載的過程,效率更高。- 盡量綁定IList而不是IEnumerable到ItemsControl。
- WPF性能優化八 - 其它性能建議
- 如果需要修改元素的Opacity屬性,最后修改一個Brush的屬性,然后用這個Brush來填充元素。
- 用NavigationWindow的時候,盡量Update the client area by object,而不是URI
- 盡量不要使用ScrollBarVisibility=Auto
留言
張貼留言