前言
無人交接的情況下,接手了一個3G大小的WPF和WF的混合項目,長達3周修復了37個BUG以后,終於到了性能優化。這個軟件怎么說呢?着實卡爆,不得已只能絞盡腦汁找文章學習優化,所以有了這篇博文。博文的內容是標准的縫合怪,主要是為了方便查看,不然一篇一篇看過於麻煩,文章的最下方均有原文鏈接,支持原創。
性能分析工具
WPF性能分析工具
WPF提供了一套性能分析工具,使您可以分析應用程序的運行時行為並確定可以應用的性能優化類型。下表列出了Windows SDK工具WPF Performance Suite中包含的性能分析工具:
工具 | 描述 |
---|---|
射孔器 | 用於分析渲染行為。 |
可視分析器 | 用於通過可視樹中的元素來概要分析WPF服務的使用,例如布局和事件處理。 |
WPF Performance Suite提供了性能數據的豐富圖形視圖。有關WPF性能工具的更多信息,請參見WPF Performance Suite。
DirectX診斷工具
DirectX診斷工具Dxdiag.exe旨在幫助您解決與DirectX相關的問題。DirectX診斷工具的默認安裝文件夾是:
~\Windows\System32
運行DirectX診斷工具時,主窗口包含一組選項卡,可用於顯示和診斷與DirectX相關的信息。例如,“系統”選項卡提供有關您的計算機的系統信息,並指定計算機上安裝的DirectX的版本。
DirectX診斷工具主窗口
內存監測軟件
Ants Memory Profiler
下載地址: https://pan.baidu.com/s/1nLF6njntaVgrXVdIaT1mOw 提取碼: phsy
使用方法:https://www.cnblogs.com/jingridong/p/6385661.html
dotMemory
https://www.jetbrains.com/dotmemory/
snoop
官網:https://chocolatey.org/packages/snoop
安裝choco
使用管理員權限打開 Powershell
Set-ExecutionPolicy RemoteSigned
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
安裝snoop
choco install snoop --pre
升級
choco upgrade snoop --pre
卸載
choco uninstall snoop --pre
內存優化
內存泄露原因
內存泄露主要原因分析:
- 靜態引用
- 未注銷的事件綁定
- 非托管代碼資源使用等
對於靜態對象盡量小或者不用,非托管資源可通過手動Dispose來釋放。
文章推薦
設計優化
規划應用程序性能
實現績效目標的成功取決於您制定績效策略的能力。規划是開發任何產品的第一步。本主題描述了制定良好性能策略的一些非常簡單的規則。
在開始開發任何WPF應用程序之前,必須先制定性能策略。應用程序啟動時間,每幀動畫頻率速率,窗口中允許的最大工作集都是可以提前計划和制定戰略的一些方案。
一旦提出了方案,就可以定義目標並以循環/迭代的方式評估,研究,改進應用程序的性能。
文章推薦
常用
容易記住的幾種優化方式
- 偏愛StaticResources而不是DynamicResources,StaticResources通過查找對已定義資源的引用來為任何XAML屬性屬性提供值。該資源的查找行為與編譯時查找相同。DynamicResources將創建一個臨時表達式,並延遲對資源的查找,直到需要請求的資源值為止。該資源的查找行為與運行時查找相同,這會對性能產生影響。盡可能始終使用StaticResource。
- 將ItemsControls綁定到IList而不是IEnumerable,當將ItemsControl綁定到IEnumerable的數據時,WPF將創建類型為IList
的包裝器,這將對第二個對象的創建產生負面影響。而是將ItemsControl直接綁定到IList,以避免包裝對象的開銷。 - 避免將數據綁定到Label.Content屬性,如果使用標簽將數據綁定到String屬性,這將導致性能下降。這是因為每次更新String源時,都會丟棄舊的字符串對象,並創建一個新的String。如果Label的內容是簡單文本,則將其替換為TextBlock,然后綁定到Text屬性。
- 畫筆上的不透明度而不是元素,如果使用“畫筆”設置元素的“填充”或“描邊”,則最好在“畫筆”上設置“不透明度”,而不是設置元素的“不透明度”屬性。修改元素的“不透明度”屬性時,它可能導致WPF創建臨時曲面,從而導致性能下降。
- 使用縮小的圖像尺寸,如果您的應用要求顯示較小的縮略圖,請考慮創建縮小尺寸的圖像。默認情況下,WPF將加載並解碼圖像到其完整尺寸。如果要加載完整的圖像並將它們縮小到ItemsControl等控件中的縮略圖大小,這可能是許多性能問題的根源。如果可能,將所有圖像合並為一個圖像,例如由多個圖像組成的膠片。
- 降低BitMapScalingMode,默認情況下,WPF使用高質量的圖像重采樣算法,該算法有時會消耗系統資源,這會導致幀速率下降並導致動畫停頓。而是將BitMapScalingMode設置為LowQuality,以從“質量優化”算法切換為“速度優化”算法。
- 在單獨的線程上加載數據,性能問題,UI凍結以及停止響應的應用程序的一個非常常見的來源是如何加載數據。確保您在一個單獨的線程上異步加載數據,以免UI線程超載。在UI線程上加載數據將導致非常差的性能以及最終用戶的整體體驗。每個WPF開發人員都應在其應用程序中使用多線程。