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

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


  图 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

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

  1. 改善WPF应用程序性能的10大方法(转)

    细数改善WPF应用程序性能的10大方法 2010年11月16日00:05 it168网站原创  作者:IT168 黄永兵  编辑:胡铭娅 评论:0条 本文Tag: ASP.NET WPF .NET   ...

  2. Asp.net性能优化-提高ASP.Net应用程序性能的十大方法

    一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...

  3. hibernate性能_改善Hibernate应用程序性能的7种方法

    hibernate性能 Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩 ...

  4. 改善Hibernate应用程序性能的7种方法

    Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩展时,我们该怎么办? 在 ...

  5. Java黑皮书课后题第7章:**7.5(打印不同的数)编写一个程序,读入10个数,显示互不相同的数的数目,并以输入的顺序显示这些数字,以输入的顺序显示这些数字,以一个空格分隔。

    **7.5(打印不同的数)编写一个程序,读入10个数,显示互不相同的数的数目,并以输入的顺序显示这些数字,以输入的顺序显示这些数字,以一个空格分隔. 题目 题目描述与运行示例 破题 题目 题目描述与运 ...

  6. 详解优化iOS程序性能的25个方法

    本篇文章主要介绍了优化iOS程序性能的25个方法,感兴趣的小伙伴们可以参考一下 1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发 ...

  7. 程序员的10大境界,计算科学的10层楼,比尔盖茨看了会自卑,牛顿看了会落泪!

    程序员10大境界 作者简介:周伟明先生毕业于上海交通大学,1994年开始 从事专业软件开发,曾工作于美国加州硅谷的DASCOM Inc公司(现为IBM的全资子公司)和华为技术有限公司等企业.在网络安全 ...

  8. 政府形象塑造_塑造业务应用程序架构的10大技术趋势

    政府形象塑造 技术往往会颠覆传统的流程​​灵活性,洞察力,交付速度,所有权和支持成本概念,从而改变业务应用程序. Forrester是一家全球研究和咨询公司,可帮助全球顶尖公司将变革的复杂性转变为业务 ...

  9. 提高C程序效率的10种方法

    任何代码的美丽不仅在于找到一个给定的问题的解决方案,但在它的简单性,有效性,紧凑性和效率(内存).设计的代码比实际执行更难 .因此,每一个程序员当用C语言开发时,都应该保持这些基本的东西在头脑中. 本 ...

最新文章

  1. 两个列表之间移动数据
  2. 阿里安全开源隐私计算新技术:计算速度快20倍,通信成本低2倍,已登安全顶会...
  3. RouterOS DNS劫持 -- A记录
  4. aix服务器屏幕显示被锁住了,AIX恢复密码过程总结
  5. 同事都说有SQL注入风险,我非说没有
  6. TCP协议的部分解析(1)
  7. liunx创建php环境变量,linux添加环境变量的方法总结
  8. 高等数学张宇18讲 第十二讲 常微分方程
  9. 计算机二级(C语言)备考
  10. 海康摄像头配置固定IP
  11. 当自己觉得特别迷茫的时候,是怎么走出这个困境的
  12. coreldraw橙子怎么画_CorelDRAW(CDR)设计绘制质感的橙子和冰块实例教程
  13. ElementUI Collapse 折叠面板
  14. mars java android_Mars Android 接入指南
  15. 虚拟化VMware简介5——DRS 与 DPM 详解
  16. 对于TGA格式文件的分析
  17. Linux 启动时,出现give root password for maintenance处理方法
  18. 浏览器的浏览模式——兼容模式
  19. 推荐一个强大的开源动态线程池项目
  20. 数据库连接报错:1086 - Unknown storage engine ‘InnoDB‘

热门文章

  1. Plist文件和字典转模型
  2. android wifi连接手机,Android手机无线连接利器-AirDroid
  3. 微信小程序获取unionid为空
  4. Render errors:One or more layouts are missing the layout_width or layout_height attributes
  5. springboot health检查
  6. Mysql显示创建表的sql语句
  7. Flex与JavaScript的交互:调用JavaScipt或者被JavaScript调用
  8. 湖南师大计算机学院院长,董新汉(数学与计算机科学学院)老师 - 湖南师范大学 - 院校大全...
  9. 1063. 计算谱半径(20)
  10. 调整latex表格_选择LaTeX还是Word的建议