Windows,Presentation,Foundations的项目部署和性能优化

时间:2023-04-25 20:48:04 公文范文 来源:网友投稿

摘要:针对Windows Presentation Foundation(WPF)这一全新的Windows应用程序的图形引擎技术,该文简要介绍了WPF的基本知识,并针对WPF的优缺点,通过个人的项目开发经历,讨论和总结在实际WPF应用程序项目中会遇到的界面开发代码结构设计和应用程序性能两大问题。该文主要研究如何合理部署WPF应用程序前台界面开发的代码结构;以及如何正确处理WPF应用程序的性能问题。

关键词:Windows Presentation Foundation;WPF;XAML;界面开发;图形引擎

中图分类号:TP3文献标识码:A 文章编号:1009-3044(2010)01-227-02

The Project Deployment and Performance Improvement of Windows Presentation Foundations

DAI Bo-le

(College of Software Engineering, Southeast University, Nanjing 210000, China)

Abstract: Windows Presentation Foundation(WPF) is a next-generation presentation system for building Windows client applications with visually stunning user experiences. This article will introduce the WPF briefly. Then against the merits and drawbacks of the WPF, two major problems that developers potentially have to face in the real work will be discussed based on personal experience. One is how to deploy the UI development work in WPF project, and the other is how to handle the performance issue of the WPF application. This research will try to focus on two main topics, which are how to reasonably design and deploy the UI development work in a WPF project, and how to deal with the performance issue of the WPF application properly.

Key Words: Windows Presentation Foundation; WPF; XAML; UI development; Graphics Presentation System

随着微软.Net Framework 3.0的发布,新一代Windows应用程序的图形引擎Windows Presentation Foundation(以下简称 WPF)开始展露头角。作为Vista操作系统的三大核心开发库之一,基于DirectX的WPF展现出对2D和3D的呈现方面的强大视觉效果,掀起了图形界面开发的一场革命。此外,WPF引入了全新的开发模式,使界面设计和代码开发更好的得到了分离,更加吸引了软件开发人员的关注和兴趣。

本文先简要介绍WPF并总结WPF的优缺点之后,将针对WPF最令人惊喜的新一代界面开发模式和最令人烦恼的性能问题,进一步讨论在WPF项目中可能遇到的设计前台开发文件的框架结构和提高WPF应用程序的性能两个实际问题,总结经验并提出建议,达到帮助具有一定WPF开发经验的广大爱好者学习的目的。

1 Windows Presentation Foundation的优势和缺陷

Windows Presentation Foundation (原名Avalon)是微软新一代图形系统,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法,是.NET Framework 3.0的重要组件。WPF构建合并了 UI、媒体和文档的丰富 Windows 智能客户端用户体验,其核心是一个与分辨率无关并且基于向量的呈现引擎,旨在利用现代图形硬件的优势给用户带来震撼的视觉效果 [1] 。

WPF的最大优势,就是它将许多富客户端的特性集成在同一个平台上,其中大部分的独立特性都单独在其他UI技术中出现过 [2] ,总结下来主要有以下几点:

1) WPF为开发用户界面提供一致的技术基础——XMAL (eXtensible Application Markup Language,可扩展应用程序标记语言),引入类似于HTML中的流式文本布局,从而使外观界面开发和后台行为开发分离开来,降低了开发和维护的成本,提高了开发的效率,同样使得WPF应用程序的全球化和本地化大大简化。

2) WPF在前后台数据访问方面提供了富客户端中的数据绑定技术,它的任务就是将数据从托管对象复制到控件中,在控件上可以显示和编辑数据,并且确保将使用控件对数据进行的修改复制回托管对象。这大大简化了对访问数据和将数据加载到应用程序托管对象的开发过程。

3) WPF基于Direct X,支持视频、动画、2D或3D图形以及各种类型的文档,从而可以让用户以全新的方式处理信息,使3D进入Web成为可能。

4) WPF为桌面客户端和浏览器客户端提供了通用基础,一套编码,桌面应用程序与Web应用程序均可运用,这大大简化了二者的应用程序开发工作,节省开发成本。

当然,WPF作为正在处于不断完善的技术,本身也存在着一些限制条件,最主要的有两点:

5) WPF属于.Net Framework 3.0中的组件,如果用户不支持.Net Framework 3.0,就无法使用WPF,这也是WPF发展和使用的最大阻碍 [2] 。

6) WPF应用程序的性能问题也同样限制了WPF在企业级程序中的应用。内存消耗过大,严重影响WPF应用程序运行效率问题。甚至WPF API本身存在着一些内存泄漏问题。随着微软.Net Framework的不断更新和Windows 7操作系统的推出,相信WPF的内存问题将会逐步被改进。

了解到WPF如此先进的界面开发技术之后,大家必定对如何使用WPF产生浓厚的兴趣。对于WPF具体的开发方法,MSDN上有详细的API介绍,这里不再详述。接下来,将重点讨论在实际开发WPF项目过程中需要注意的一些方面。

2 WPF项目开发中的实际问题

2.1 WPF界面设计文件组织结构的设计和管理

众所周知,WPF开发的一大特色就是采用XAML语言,使外观界面开发和后台行为开发相分离,提高了项目的开发效率和可维护性。但即便后台C#代码中创建前台布局的代码减少了,大量的前台代码如果不加以合理的组织,也会大大降低前台页面代码的易读性和可维护性。因此管理组织好界面开发的XAML文件,对增加项目的开发效率、易读性、可维护性、可重用性和可扩展性都是有益的。

经过前人经验的积累和个人项目经历的总结,以下几个方面在部署组织XAML代码是很值得考虑的:

1) 样式文件和界面布局文件的分离。这一点广大的网络应用程序开发人员都会注意到,这就好比HTML代码和CSS样式文件的分离。针对项目对用户界面的需求,编写一套用于项目各个组件的界面布局设计文件,专门定义界面中各个控件在组件界面中的分布位置。而界面中各个控件所需的细节样式,如背景颜色、按钮样式等,编写在其他一些独立的文件中。布局文件则引入所需的样式文件,通过不同的键值来调用特定的样式使用。这样不仅用于显示布局的XAML文件简洁易读,容易理解,而且存储在独立XAML文件中的各个样式也可以被多个XAML文件重复调用,增加了开发效率和重用性。

2) 样式文件的分类存放。WPF几乎所有控件都可以定义样式,比如颜色(Brush)、按钮(Button)和列表(ListBox)等。在使用独立文件存储样式的基础上,按样式描述的控件类型分类存储各种样式可以方便开发人员在查询、修改,甚至添加某个样式,大大增加了软件的可维护性。

3) 建立一个XAML资源文件用于在应用程序启动时统一引入所有资源供应用程序使用,而不是在每个XAML文件中引入所需样式文件,这样不仅减少项目的内存利用率,而且这个统一的XAML资源文件好像皮肤文件一个,引入不同的样式文件可以呈现不同的界面效果。当遇到多个需求类似的项目时,只需为不同的项目量身订做不同的界面效果,同一组件的布局文件可以保持不变,大大加强了项目的多样性和可重用性。同时这个统一的资源文件还可以用于引入诸如图片、声音,甚至用于数据绑定的转换器资源等,进一步的增加项目的重用性。

4) 在编写项目各个组件的布局文件时,对可能被其他组件重用、甚至其他项目重用的某些控件集,尽量独立设计一个自定义的控件。比如一个文本输入框和按钮组成的用于搜索的控件集,可以单独设计为一个自定义控件供项目中的其他功能组件使用。通常被重用的自定义控件可以称为公共组件(Common Component)。在整个项目中单独建立一个定义和实现公共组件的子项目,可以增加项目本身的可重用性,为企业创建和积累良好的代码资源库。

5) 创建独立的XAML文件用于存储界面上所要显示的所有字符信息。这一点不仅有利于字符串资源的管理和维护,而且在软件业逐渐国际化的背景下,有利于软件本身的本地化和全球化。

当然,如何设计、管理好WPF中的界面设计文件,必须结合多方面的因素(如 项目功能需求、性能要求和项目规模等)考虑。比如在创建自定义窗体时,由于大多数用到的控件(背景颜色、最大/最小化按钮等)都只能用于自定义窗体的样式定义中,而且不同的项目可能使用不同的窗体样式,因此可以考虑不用将各类样式细分到相对类型的样式文件中,而采用放置于一个同一文件中统一管理,有可能更便于日后维护。因此,以上建议仅适用于大多数WPF项目的开发,开发人员还需谨慎选择应用。

2.2 WPF应用程序的性能

要完美实现WPF的强大功能,就需要强大的硬件支持,这不仅包括显卡对于图像呈现的帮助,还包括CPU和内存对于WPF界面控件加载和前后台数据信息交换的处理。采用WPF编写的Windows应用程序往往都存在着性能低下的问题,而且规模越大,性能问题越发明显,从而也制约了WPF在企业级Windows应用程序中的普及。

优化WPF应用程序性能,除了可以通过常规的改进后台程序中算法和设计模式来提高性能以外,还可以改进WPF应用程序前台XAML代码的开发。在开发XAML代码的过程中有太多细节需要开发人员注意,这里就不一一阐述,仅介绍几个主要原则:

1) 注意资源的共享,尽量避免相同资源的重复导入。这个是有关资源文件部署引入的问题,如前章所讲,如果创建单独的样式文件,并在项目系统级统一导入所有资源文件,而非每个组件各自导入所需资源文件,这样除了提高资源共享率以外,还可以大大提高应用程序的性能。

2) 根据功能需求,选择合适的控件,避免不必要的功能资源浪费,减少加载控件的性能成本。

举例来说,WPF主要提供三种绘制文本的控件:Label、TextBlock和FlowDocument。通常,当需要支持有限的文本(例如用户界面 (UI) 中的简短语句)时,应使用 TextBlock元素。当只需要支持最少的文本时,可以使用 Label。FlowDocument元素是支持内容丰富表示的可重流动文档的容器,因此,使用该元素时对性能的影响大于使用TextBlock或Label控件时对性能的影响[3] 。

3) 合理利用控件中的属性设置,在不影响用户需求的前提下,禁用一些性能成本消耗大的功能和效果,或启用WPF本身提供的优化性能的机制,达到提高性能的目的。

比如在利用ListBox加载显示大量数据时,由于标准布局系统会为每个与列表控件关联的项创建一个布局容器,并计算其布局大小和位置,因此如果一次性加载列表中的所有数据项就会导致性能问题。WPF支持用户界面的虚拟化,这就使得项容器的生成和关联布局的计算推迟到项在界面上可见时进行,提高了性能。用户可以通过对设置VirtualizingStackPanel.IsVirtualizing属性控制界面虚拟化的开关,不仅如此,用户还可以VirtualizingStackPanel.VirtualizationMode属性来回收不在界面视图之内的项的项容器,进一步优化界面虚拟化功能来提高性能。[3]

4) 注意程序中的内存管理,避免不必要的内存泄漏。由于WPF利用CLR提供的托管代码管理内存,以提高开发效率和可靠性,但是这是要以牺牲性能作为代价的,甚至往往有些内存不能及时的释放,最后甚至造成内存泄漏。

WPF本身存在在一些可能造成内存泄漏的功能,开发人员在使用这些功能时,如果不合理管理内存的使用,往往就会给程序带来不必要的内存泄漏。比如使用事件处理机制的情况下,在控件A代码中添加了一个针对控件B的事件,并对相应的事件在控件A代码中定义了一个事件处理器,

B.SomeEvent += new EventHandler(A.SomeMethod)

当完成对A的操作之后释放A所占用的内存空间时,如B仍然存在,那么A所占用的内存也是无法被释放的,这就造成了内存泄漏。因此在开发时须注意,当对A的所有操作完成之后,要移除定义在B上某事件上的事件处理器,

B.SomeEvent += new EventHandler(A.SomeMethod)

这样才能彻底的让CLR释放A所占用的内存资源,避免内存泄漏。[4]在WPF的开发中存在很多这样类似的应该注意内存泄漏问题的情形,具体的可以参阅参考文献4的文章中所介绍的各类情形。

5) 设计开发时,避免性能成本大的控件一起使用,导致程序性能下降。比如由于位图效果非常消耗CPU,因此不得将位图效果应用于大型可视对象或动画。

6) 对于WPF提供的特殊功能尽量使用WPF提供的相对应的类来实现,因为.Net Framework所提供的一些内置机制已经为WPF的特色功能解决了一些性能问题,直接使用反而比开发人员自己实现要有效的多。这一点尤其体现在数据绑定机制上。WPF中的数据绑定机制,可以绑定普通的CLR对象,并通过实现一些属性变更通知机制来实现,当然也可以直接绑定WPF提供的DependencyObject的DependencyProperty上,在性能比较上,后者要优于前者。

如何优化WPF应用程序的性能还需注意很多细节的地方,具体的做法可以阅读参考文献3中的相关文章。开发人员也可以使用一些性能分析工具来测试WPF应用程序中各组件的资源占有情况,从而便于集中精力解决资源消耗大的部分。最常用的就是WPF提供的XamlPad(用于查看XAML文档结构)和WpfPerf(用于WPF 性能检查)中的可视化探查器(Visual Profiler,用于 WPF 服务如布局和事件处理的使用情况)[5]。其余具体的工具介绍和使用方法可以浏览参考文献5中所涵盖的资料。

3 总结

综上所述,作为新一代Windows应用程序界面开发技术,WPF无论从开发模式还是界面呈现效果上,都是界面开发技术上的一次革命。这场技术革命,即给开发人员带来了如流式文本开发模式和数据绑定功能这样的惊喜,也在技术选择和开发上提出了诸如性能问题这样的挑战。总的来说,对于开发WPF应用程序来说,只有在了解项目需求,根据WPF提供的UI控件的特性设计合理的界面之后,要充分运用XAML技术来实现界面设计和后台逻辑行为的分离,利用数据绑定带来的方便,并时时刻刻控制内存的使用,注意程序性能,才能为成功完成WPF项目打下坚实的基础。

参考文献:

[1] 美国微软公司MSDN.Windows Presentation Foundation 简介[EB/OL].https://msdn.microsoft.com/zh-cn/library/aa970268.aspx.

[2] Ian Griffiths,赵劼译.把WPF作为一种富客户端技术[EB/OL]./cn/articles/wpf-rich-client-java.

[3] 美国微软公司MSDN.优化WPF应用程序性能[EB/OL].https://msdn.microsoft.com/zh-cn/library/bb613560.aspx.

[4] Jgoldb.Finding Memory Leaks in WPF-based applications[EB/OL]. https://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx.

[5] Adam Nathan with Daniel Lehenbauer,Windows Presentation Foundation Unleashed[M].SAMS,2006(12):618-620.

推荐访问:部署 性能 优化 项目 Windows