WPF效能最佳化經驗總結

來源:互聯網
上載者:User

標籤:

WPF效能最佳化經驗總結

WPF效能最佳化一、Rendering Tier 

1. 根據硬體設定的不同,WPF採用不同的Rendering Tier做渲染。下列情況請特別注意,因為在這些情況下,即使是處於Rendering Tier 2的情況下也不會硬體加速。(不全,其餘請查閱SDK) 

WPF效能最佳化二、布局和設計 

1.盡量多使用Canvas等簡單的布局元素,少使用Grid或者StackPanel等複雜的,越複雜效能開銷越大。 

2.建立邏輯樹狀結構或者視覺樹的時候,遵循Top-Down的原則。 

WPF效能最佳化三、映像 

1. 對Image做動畫處理的時候(如調整大小等),可以使用這條語句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善效能。 

2. 用TileBrush的時候,可以CachingHint。 

WPF效能最佳化四、對象行為 

1.訪問CLR對象和CLR屬性的效率會比訪問DependencyObject/DependencyProperty高。注意這裡指的是訪問,不要和前面的綁定混淆了。但是,把屬性註冊為DependencyProperty會有很多的優點:比如繼承、資料繫結和Style。 

WPF效能最佳化五、應用程式資源 

1. 在自訂控制項,盡量不要在控制項的ResourceDictionary定義資源,而應該放在Window或者Application級。因為放在控制項中會使每個執行個體都保留一份資源的拷貝。 

2. 盡量使用Static Resources,但不能盲目使用。 

WPF效能最佳化六、文本 

1. 文字少的時候用TextBlock或者label,長的時候用FlowDocument. 

2. 使用元素TextFlow和TextBlock時,如果不需要TextFlow的某些特性,就應該考慮使用TextBlock,因為它的效率更高。 

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代價要比使用TextElement(比如Run)的代價高.在FlowDocument中盡量避免使用TextBlock,要用Run替代。 

4. 在TextBlock中顯式的使用Run命令比不使用Run命名的代碼要高。 5. 把Label(標籤)元素的ContentProperty和一個字串(String)綁定的效率要比把字串和TextBlock的Text屬性綁定的效率低。因為Label在更新字串是會丟棄原來的字串,全部重新顯示內容。如果字串不需要更新,用Label就無所謂效能問題。 

6. 在TextBlock塊使用HyperLinks時,把多個HyperLinks組合在一起效率會更高。 

7. 顯示超連結的時候,盡量只在IsMouseOver為True的時候顯示底線,一直顯示底線的代碼高很多 

8. 盡量不使用不必要的字串串連。 

WPF效能最佳化七、資料繫結 

1.在使用資料繫結的過程中,如果繫結資料源是一個CLR對象,屬性也是一個CLR屬性,那麼在綁定的時候對象CLR對象所實現的機制不同,綁定的效率也不同。 

A、資料來源是一個CLR對象,屬性也是一個CLR屬性。對象通過TypeDescriptor/PropertyChanged模式實現通知功能。此時綁定引擎用TypeDescriptor來反射來源物件。效率最低。 

B、資料來源是一個CLR對象,屬性也是一個CLR屬性。對象通過INotifyPropertyChanged實現通知功能。此時綁定引擎直接反射來源物件。效率稍微提高。 

C、資料來源是一個DependencyObject,而且屬性是一個DependencyProperty。此時不需要反射,直接綁定。效率最高。 

2.當一個CLR對象很大時,比如有1000個屬性時,盡量把這個對象分解成很多很小的CLR對象。比如分成1000個只有一個屬性的CLR對象。 

3. 當我們在列表(比如ListBox)顯示了一個CLR對象列表(比如List)時,如果想在修改List對象後,ListBox也動態反映這種變化。此時,我們應該使用動態ObservableCollection對象綁定。而不是直接的更新ItemSource。兩者的區別在於直接更新ItemSource會使WPF拋棄ListBox已有的所有資料,然後全部重新從List載入。而使用ObservableCollection可以避免這種先全部刪除再重載的過程,效率更高。 

4. 盡量綁定IList而不是IEnumerable到ItemsControl。 

WPF效能最佳化八、其它效能建議 

1. 如果需要修改元素的Opacity屬性,最後修改一個Brush的屬性,然後用這個Brush來填充元素。因為直接修改元素的Opacity會迫使系統建立一個臨時的Surface 

2. 用NavigationWindow的時候,盡量Update the client area by object,而不是URI 

3. 盡量不要使用ScrollBarVisibility=Auto 

 

WPF效能最佳化一、Rendering Tier 

1. 根據硬體設定的不同,WPF採用不同的Rendering Tier做渲染。下列情況請特別注意,因為在這些情況下,即使是處於Rendering Tier 2的情況下也不會硬體加速。(不全,其餘請查閱SDK) 

WPF效能最佳化二、布局和設計 

1.盡量多使用Canvas等簡單的布局元素,少使用Grid或者StackPanel等複雜的,越複雜效能開銷越大。 

2.建立邏輯樹狀結構或者視覺樹的時候,遵循Top-Down的原則。 

WPF效能最佳化三、映像 

1. 對Image做動畫處理的時候(如調整大小等),可以使用這條語句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善效能。 

2. 用TileBrush的時候,可以CachingHint。 

WPF效能最佳化四、對象行為 

1.訪問CLR對象和CLR屬性的效率會比訪問DependencyObject/DependencyProperty高。注意這裡指的是訪問,不要和前面的綁定混淆了。但是,把屬性註冊為DependencyProperty會有很多的優點:比如繼承、資料繫結和Style。 

WPF效能最佳化五、應用程式資源 

1. 在自訂控制項,盡量不要在控制項的ResourceDictionary定義資源,而應該放在Window或者Application級。因為放在控制項中會使每個執行個體都保留一份資源的拷貝。 

2. 盡量使用Static Resources,但不能盲目使用。 

WPF效能最佳化六、文本 

1. 文字少的時候用TextBlock或者label,長的時候用FlowDocument. 

2. 使用元素TextFlow和TextBlock時,如果不需要TextFlow的某些特性,就應該考慮使用TextBlock,因為它的效率更高。 

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代價要比使用TextElement(比如Run)的代價高.在FlowDocument中盡量避免使用TextBlock,要用Run替代。 

4. 在TextBlock中顯式的使用Run命令比不使用Run命名的代碼要高。 5. 把Label(標籤)元素的ContentProperty和一個字串(String)綁定的效率要比把字串和TextBlock的Text屬性綁定的效率低。因為Label在更新字串是會丟棄原來的字串,全部重新顯示內容。如果字串不需要更新,用Label就無所謂效能問題。 

6. 在TextBlock塊使用HyperLinks時,把多個HyperLinks組合在一起效率會更高。 

7. 顯示超連結的時候,盡量只在IsMouseOver為True的時候顯示底線,一直顯示底線的代碼高很多 

8. 盡量不使用不必要的字串串連。 

WPF效能最佳化七、資料繫結 

1.在使用資料繫結的過程中,如果繫結資料源是一個CLR對象,屬性也是一個CLR屬性,那麼在綁定的時候對象CLR對象所實現的機制不同,綁定的效率也不同。 

A、資料來源是一個CLR對象,屬性也是一個CLR屬性。對象通過TypeDescriptor/PropertyChanged模式實現通知功能。此時綁定引擎用TypeDescriptor來反射來源物件。效率最低。 

B、資料來源是一個CLR對象,屬性也是一個CLR屬性。對象通過INotifyPropertyChanged實現通知功能。此時綁定引擎直接反射來源物件。效率稍微提高。 

C、資料來源是一個DependencyObject,而且屬性是一個DependencyProperty。此時不需要反射,直接綁定。效率最高。 

2.當一個CLR對象很大時,比如有1000個屬性時,盡量把這個對象分解成很多很小的CLR對象。比如分成1000個只有一個屬性的CLR對象。 

3. 當我們在列表(比如ListBox)顯示了一個CLR對象列表(比如List)時,如果想在修改List對象後,ListBox也動態反映這種變化。此時,我們應該使用動態ObservableCollection對象綁定。而不是直接的更新ItemSource。兩者的區別在於直接更新ItemSource會使WPF拋棄ListBox已有的所有資料,然後全部重新從List載入。而使用ObservableCollection可以避免這種先全部刪除再重載的過程,效率更高。 

4. 盡量綁定IList而不是IEnumerable到ItemsControl。 

WPF效能最佳化八、其它效能建議 

1. 如果需要修改元素的Opacity屬性,最後修改一個Brush的屬性,然後用這個Brush來填充元素。因為直接修改元素的Opacity會迫使系統建立一個臨時的Surface 

2. 用NavigationWindow的時候,盡量Update the client area by object,而不是URI 

3. 盡量不要使用ScrollBarVisibility=Auto

WPF效能最佳化經驗總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.