细数改善WPF应用程序性能的10大方法

  WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。 

  程序性能改善不是一蹴而就的,好的设计可以消除影响性能的问题,例如,在运行时构造对象就会对程序的性能造成影响。虽然WPF通过增强的导航等功能提供了更丰富的用户界面,但你应该考虑你的用户是否的确需要富图形界面,尽管WPF有这样那样的问题,但在UI设计,特别是自定义风格和控件模板方面,的确给开发人员提供了不少灵活性。

细数改善WPF应用程序性能的10大方法
  图 1 WPF架构,蓝色是Windows组件,褐色是WPF组件

  渲染WPF程序的主要因素是它包含的像素量,WPF使用微软的DirectX在程序运行的硬件上进行渲染,因此,如果你的机器有独立显卡,运行WPF程序会更流畅。除了提高硬件配置外,我们来看看10个提高WPF程序性能的软方法。

  1、降低Bitmapscalingmode,加速图像渲染

  当你的WPF程序中包含有动画时,你可以使用RenderOptions对象的BitmapScalingMode属性降低资源消耗,需要将BitMapScalingMode属性的值设为LowQuality,这样就会使用加速算法处理图像,而不是默认的高质量图像重采样算法。下面的代码片段显示了最基本的实现方法:

RenderOptions.SetBitmapScalingMode(imageObject,BitmapScalingMode.LowQuality);

 

  2、在正确的地方使用正确的元素

  我们需要在正确的地方使用正确的元素,当你生成树时应避免使用UIElements作为子或嵌套控件,最好的例子是FlowDocument,我们经常在FlowDocument中使用TextBlock元素。

<FlowDocument>     <Paragraph>       <TextBlock>some text</TextBlock>     </Paragraph>   </FlowDocument>

 

  除了上面这样写外,我们还可以象下面这样重写XAML内容,Run元素不是UIElement,渲染时系统开销更小。

<FlowDocument>  <Paragraph>    <Run>some text</Run>  </Paragraph></FlowDocument>

 

  类似的例子是使用Label控件的Content属性,如果在其生命周期内内容不止更新一次,并且是个字符串,这个数据绑定过程可能会阻碍程序的性能,由于内容是一个字符串,在数据绑定期间它会被丢弃,并重新创建。在这种情况下使用TextBlock将数据绑定到Text属性更有效。

  在可视化树中出现不必要的元素也会降低WPF程序的速度,你最好结合布局优化默认的控件模板。 

  3、增加静态资源的使用

  静态资源是预定义的资源,可以连接到XAML属性,它类似于编译时绑定,不会影响性能,另一方面,动态资源涉及到运行时查找和对象的构建,从而会影响到性能。但也需要注意,静态资源需要在编译时展示。

  静态资源的引用可以参考下面的方法:

<Button         Template="{StaticResource RoundButtonWithThickEdge}"          x:Name="button1" Content="Button 1">   </Button>

 

  下面的代码片段显示了静态资源RoundButtonWithThickEdge的定义:

<ControlTemplate        x:Key="RoundButtonWithThickEdge"        TargetType="{x:Type Button}">        <Grid>          <Ellipse Fill="{TemplateBinding Background}"            Stroke="{x:Null}"            HorizontalAlignment="Stretch" x:Name="ellipse"/>              <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>                  <Ellipse Stroke="{x:Null}" Margin="2,3,4,5">                    <Ellipse.Fill>                      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">                    <GradientStop Color="#FFFBFAFA" Offset="0"/>                   <GradientStop Color="#1DFFFFFF" Offset="1"/>              </LinearGradientBrush>            </Ellipse.Fill>          </Ellipse>        </Grid>      </ControlTemplate>

 

  4、当你想显示大型数据时,使用UI虚拟化的控件

  想象一下一个组合框绑定大量行时的样子,它会让组合框中项目的展现变得非常慢,这是因为在这种情况下,程序需要计算每个项目的具体显示位置,使用WPF时,你可以延迟这个行为,这就叫做UI虚拟化,它只会在其可见范围内生产项目显示需要的容器。

  要实现这种效果,你需要将相应控件的IsVirtualizing属性设为True,例如,Listbox经常用来绑定大型数据集,它是UI虚拟化的重要候选者,其它适宜UI虚拟化的控件包括Combobox,ListView和TreeView。

  5、使用延迟滚动增强用户体验

  如果你还记得可滚动的DataGrid或ListBox,它们往往会降低整个应用程序的性能,因为在滚动时会强制连续更新,这是默认的行为,在这种情况下,我们可以使用控件的延迟滚动(Deferred Scrolling)属性增强用户体验。你需要做的仅仅是将IsDeferredScrollingEnabled附加属性设为True。

  6、使用字体缓存服务提高启动时间

  WPF应用程序之间可以共享字体数据,它是通过一个叫做PresentationFontCache Service的Windows服务实现的,它会随Windows自动启动。

  你可以在控制面板的“服务”中找到这个服务(或在“运行”框中输入Services.msc),确保这个服务已经启动。

  7、使用卸载事件卸载不必要的动画

  动画肯定会占用一定的资源,如果处置方式不当,将会消耗更多的资源,如果你认为它们无用时,你应该考虑如何处理他们,如果不这样做,就要等到可爱的垃圾回收器先生来回收资源。

  例如,假设要删除一个StoryBorad,在Unload事件中使用StoryBorad的Remove方法,下面的例子来自MSDN。

<EventTrigger RoutedEvent="Page.Unloaded">           <EventTrigger.Actions>             <RemoveStoryboard BeginStoryboardName="myBeginStoryboard"/>           </EventTrigger.Actions>   </EventTrigger>

 

  8、使用容器回收提高性能

  你可以通过回收执行虚拟化的容器来提高性能,下面的代码片段将ViruatlizationMode设为Recycling,它让你可以获得更好的性能。当用户滚动或抵达另一个项目时,它强制重复使用容器对象。

settingVirtualizingStackPanel.VirtualizationMode="Recycling"

 

  9、预测图像绘制能力

  使用RenderCapability.Tier属性确定机器是支持硬件加速,还是部分硬件加速,疑惑没有硬件加速,下面的代码显示了你要如何检查Tier。

int displayTier = (System.Windows.Media.RenderCapability.Tier >16)      if (displayTier ==0)   {      //no hardware acceleration   }   elseif (displayTier ==1)   {      //partial hardware acceleration   }   else   {      //supports hardware acceleration   }

 

  确定了之后,你就可以有选择性地选择那些在用户硬件上工作得很好的功能

  10、使用WPF分析工具分析WPF程序

  分析WPF程序是理解其行为很重要的一步,市场上有大量现成的WPF程序分析工具,如Snoop,WPFPerf,Perforator和Visual Profiler,其中Perforator和Visual Profiler是WPF Performance Suite的一部分,要了解这些工具的用法,请去它们的项目主页。

转载于:https://www.cnblogs.com/happyyftk/p/3328160.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb宿舍管理系统源码_宿舍信息管理系统展示

宿舍信息管理系统今天整理学习笔记的时候发现了自己当时学SSM框架的时候写了一个简单的Javaweb宿舍信息管理系统&#xff0c;虽然现在看来写的不是很好&#xff0c;但今日写此文章也算是纪念自己的第一个SSM小项目了&#xff0c;话不多说&#xff0c;直接开始。项目简介&#x…

Qt UDP的初步使用

为了使用Qt自带的Socket进行网络编程&#xff0c;先必须熟悉Socket编程的原理&#xff0c;另外还需对Qt一些基本类的操作比较熟悉。由于刚接触不久&#xff0c;所以还是以看人家的代码来学习。这次主要是学Qt下UDP的编程&#xff0c;且熟悉一些Qt下代码的编写流程&#xff0c;所…

下列哪一项不是计算机网络的典型应用,09级计算机信息网络试卷A

…………密…………封…………线…………内…………请…………不…………要…………答…………题…………河北工程大学11~12学年第二学期期末考试试卷A一、填空题(每空1分&#xff0c;共10分)1、在因特网中&#xff0c;远程登录Telnet系统采用的应用工作模式为____客户机&#…

hdu 4452

今天模拟赛的一个模拟题&#xff1b; 每次看到这种题就感觉很繁琐&#xff1b; 这次静下心来写写&#xff0c;感觉还不错&#xff01;就是很多错误&#xff0c;浪费了一点时间&#xff1b; 代码&#xff1a; 1 #include<cstdio>2 #include<cstring>3 using namespa…

wincc怎么做数据库_wincc7.4 数据库的建立与查询

要是时间足够&#xff0c;建议学习以下内容&#xff1a;1&#xff0c;数据库基础&#xff0c;学习建库建表&#xff0c;以及基本的查询操作。如果数据需要处理的话也需要学习一下聚合函数。2&#xff0c;VBS脚本。做数据库的话建议用VBS&#xff0c;学起来和用起来简单一些。主…

uboot 的i2c_read

int i2c_read(u8 dev, //i2c设备地址 uint addr, //读i2c设备的数据起始地址&#xff0c;比如e2 int alen, //e2的地址位数&#xff0c;0为8位&#xff0c;1为16位&#xff0c;2为32位 u8 *data, //…

固定资产管理有关的计算机知识,计算机技术在固定资产管理中的具体应用.pdf...

计算机技术在固定资产管理中的具体应用2Ol6年 I2月 太 原 学 院 学 报 Vo1&#xff0e;34 No&#xff0e;4第 34卷 第 4期Dec&#xff0e; 2016计算机技术在固定资产管理中的具体应用赵丽敏(硅湖职业技术学院&#xff0c;江苏 昆山215300)摘 要 &#xff1a;固定资产 管理是 一…

弹出键盘,UIView 上移

声明欢迎转载&#xff0c;但是请尊重作者劳动成果&#xff0c;转载请保留此框内声明&#xff0c;谢谢。 文章出处&#xff1a;http://blog.csdn.net/iukey //--------------------------------------------------------------------------------------------------------------…

hdfs如何查找指定目录是否文件_在shell中如何判断HDFS中的文件目录是否存在

原标题&#xff1a;在shell中如何判断HDFS中的文件目录是否存在在Linux文件系统中&#xff0c;我们可以使用下面的Shell脚本判断某个文件是否存在&#xff1a;# 这里的-f参数判断$file是否存在if[ ! -f "$file"]; thenecho"文件不存在!"fi但是我们想判断HD…

用计算机MR,计算机上的【MC、MR、M

计算机上的【MC、MR、M2018-09-08计算机上的【MC、MR、M-、M】键各是什么意思?例举各自的作用&#xff1f;推荐内容计算机上的【MC、MR、M-、M】键各是什么意思?例举各自的作用&#xff1f;帮帮忙...帮帮忙问题库来自 匿名用户 的提问最佳答案由提问者推荐匿名用户M&#xff…

POJ 1328 Radar Installation 贪心

传送门http://poj.org/problem?id1328 题目大意&#xff1a;平面上有一些岛屿&#xff0c;现要求用一些圆心在x轴上的&#xff08;雷达&#xff09;来覆盖这些岛屿&#xff0c;问最少需要的雷达数目。 看了大神的思路&#xff1a; 把点按横坐标排序&#xff0c;然后把每个点的…

layui 怎么设置点击图片放大_layui等比例放大/缩小图片

HTMLJS$("#photo").click(function(){showImg($(this));});function showImg(imgData){var img new Image();img.src imgData.attr("src");var height img.height; // 原图片大小var width img.width; //原图片大小var winHeight $(window).height() …

移植ssh到arm

1. 下载需要的源码:mkdir -p ~/arm/fs ;mkdir -p ~/arm/source下载zlib: wget -c http://www.zlib.net/zlib-1.2.3.tar.gz下载ssl: wget -c http://www.openssl.org/source/openssl-0.9.8d.tar.gz下载ssh: wget -c http://mirror.mcs.anl.gov/openssh/portable/openssh-4.6p1…

学霸系统计算机天才,小欢喜:开局获得学霸系统

小欢喜&#xff1a;开局获得学霸系统连载中26万字||更新时间:2020-08-02 03:16:18莫名其妙穿越到小欢喜的世界当中&#xff0c;江辰成为了春风中学高三学生&#xff0c;和方一凡、季杨杨、乔英子等人成为了朝夕相伴的同学&#xff0c;并且一开局就获得了无敌的超级学霸系统。 …

openpyxl 绘制饼形图_好享学丨快速上手Pythonmatplotlib 箱线图绘制,学术人必备

好享学是高下制图推出的关于数据可视化经验分享栏目&#xff0c;我们将定期与您分享各界优秀人士的制图经验&#xff0c;一同学习。01. 引言箱线图(Boxplot) 是一种用作显示一组数据分散情况资料的统计图表&#xff0c;本期推文就如何使用matplotlib和seaborn 绘制出高度定制化…

揭开Socket编程的面纱

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧&#xff1f;随着网络技术的发展&#xff0c;这些词充斥着我们的耳朵。那么我想问&#xff1a; 1. 什么是TCP/IP、UDP&#xff1f; 2. Socket在哪里呢&#xff1f; 3. Socket是什么呢&#xff1f; 4. 你会使用它们吗&#xff1f;…

flash地址 html,STM32 Flash读写;Flash地址对应的存储内容及方式

概念&#xff1a;计算机中最小的信息单位是bit&#xff0c;也就是一个二进制位&#xff0c;8个bit组成一个Byte&#xff0c;也就是1个字节&#xff0c;1个存储单元存放1个字节&#xff0c;每个存储单元对应一个32位(bit)地址&#xff0c;所以重要的话说三遍&#xff1a;对于32b…

socket中的函数遇见EINTR的处理

这几天&#xff0c;写服务器代码过程当中&#xff0c;遇见EINRT信号的问题&#xff0c;我是借鉴 《unp 》&#xff0c;采用continue或者goto again循环解决的。但是感觉这个还是很有必要记录一下。网络上查找到的信息很多。下面是我查找到的和EINTR有关的介绍&#xff1a;1 ht…

vue 如何获取图片的原图尺寸_公众号封面图片尺寸是多少?如何在公众号里制作封面图?...

公众号文章封面图是自己动手制作还是直接使用网络图片呢&#xff1f;在刚开始接触公众号运营时&#xff0c;我的大部分插图和封面图都是直接选择网络图片&#xff0c;后来才发现&#xff0c;自己制作的封面图更能传达文章的内容&#xff0c;阅读效果更好。其实很多做公众号的人…

主机名排序

主机名排序 主机名由多级域名组成&#xff0c;自右向左&#xff0c;依次是顶级域名、二级域名、三级域名…..以此类推 例&#xff0c;主机名&#xff1a;google.com.hkhk是顶级域名 com是二级域名 google是三级域名 现在我们需要实现一个主机名的排序功能 排序规则 1&#xff…