WPF性能优化
前言
无人交接的情况下,接手了一个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开发人员都应在其应用程序中使用多线程。