WPF 性能优化建议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BYH371256/article/details/89226422

本章讲述:WPF 性能优化建议

20180930 WPF性能优化问题:运行软件发现CPU使用率很大(80%-95%),程序中含有委托,线程,定时器的处理,之前优化时,主要优化线程和定时器相关线程方面的处理,但是效果甚微;

无意间看到博客中说程序界面中使用了投影效果会造成CPU使用率高,就试着修改,没想到,软件运行稳定后CPU使用率下降到了30%左右。

现整理一下WPF性能优化建议:

1、尽量不使用DropShadowEffect投影效果,消耗资源很大;

2、在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝;

3、尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,减小开销;

4、少用Margin Padding尤其避免嵌套使用;

5、尽量使用Static Resources不用DynamicResource;

6、计时尽量使用DispatcherTimer替代Timer;

7、自定义控件尽量从轻量级的控件继承;

8、需要绑定的属性设置为DependencyProperty的依赖项属性效率要高很多,不要自己写继承自INotifyPropertyChanged的属性:http://www.codeproject.com/Articles/62158/DependencyProperties-or-INotifyPropertyChanged

9、文字少的时候用TextBlock或者label,长的时候用FlowDocument;

10、绑定的字符串用Textblock;不用label;

11、如果正在绘制的内容需要频繁地重新绘制,考虑设置各Uelement对象的CacheMode="BitmapCache";

12、避免使用 Run 来设置文本属性:(MSDN)

   <TextBlock>
      <Run FontWeight="Bold">Hello, world</Run>
    </TextBlock>
    <TextBlock FontWeight="Bold">
      Hello, world
    </TextBlock>

13、尽量不要过分依赖使用值转换器;尽量少使用第三方类库;尽量不要设置控件Opacity属性,而用Visibility

14、加快WPF程序的启动速度:

    (1).减少需要显示的元素数量,去除不需要或者冗余的XAML元素代码.

    (2).使用UI虚拟化,只显示当前需要显示的元素.

    (3).不要把不要显示的自定义控件隐藏在主界面中,虽然它们不会显示出来,但是程序启动时还是会去计算自定义控件所需的空间和位置.

15、 耗时操作放在放在非UI线程上处理,保持UI的顺畅。处理完成后如果需要在UI上展示,调用Dispatcher.BeginInoke()方法。更多内容参考WPF QuickStart系列之线程模型(Thread Model);

16、关于Data Binding,根据实际情况对Binding指定不同的Mode,性能OneWay优于TwoWay。另外修正掉系统中Binding错误,可以在Visual Studio的输出日志中查找System.Windows.Data Error;

17、Resources: 系统资源,通常情况下我们会把样式资源都统一到App.xaml中,这是很好的,便于资源的管理。不过尽量把多次重复用到的资源放到App.xaml中。例如某些页面的资源只会在当前页面中使用到,那么可以把资源定义在当前页面; 如非必要,不要使用DynaicResource,使用StaticResource即可;

18、对Item类型控件重写时,使用VirtualizingStackPanel作为ItemPanel,这样列表资源可以只渲染当前需要的内容。不过如果设置CanContextScrol="True"会阻止虚拟化,另外使用VirtualizingStackPanel时,可以设置VirtualizingStackPanel.VirtualizationMode="Recycling", 这样已经显示过的列表不会被重复创建和释放掉。

19、尽量少的使用Animation,尤其在程序启动时,Animation渲染时会占用一些CPU资源。

猜你喜欢

转载自blog.csdn.net/BYH371256/article/details/89226422
WPF