WPF优点之比较GDI,GDI+

在.NET相关领域的开发中,用户界面主要由Windows Forms或者Web Forms实现。虽然Windows Forms已经出现了很多年,也提供了快速、高效的功能。但是,Windows Forms开发的UI界面相对比较单调,而且经过.NET Framework封装后的开发库在自定义和各种底层功能上缺少真正的支持。WPF与Win32、WinFormsGDI是当今Window桌面应用程序的主流图形库,GDI图形系统已经形成了很多年。它提供了2D图形和文本功能,以及受限的图像处理功能。虽然在一些图形卡上支持部分GDI的加速,但是与当今主流的Direct3D加速相比还是很弱小。GDI+开始出现是在2001年,它引入了2D图形的反走样,浮点数坐标,渐变以及单个象素的Alpha支持,还支持多种图像格式。但是,GDI+没有任何的加速功能(全部是用软件实现)。
熟悉Windows XP和Windows Forms技术的朋友可能都知道,在Windows Forms中也支持一种高级的合成,支持半透明的表单,但是,在Windows Forms中的半透明等技术是伪装实现。比如,显式半透明窗口时,父窗口的背景是通过子窗口实现的。
在WPF中,引入一种新的图形合成引擎。可以提供更高丰富的图形显式合成,而且不会有任何的窗口闪烁问题。这种新的显式提交引擎与传统的Win32、Windows Forms相比主要有两个优点:
1、所有的每个窗口元素都可以任意的交替重叠。
2、所有的合成操作都是Direct3D中的离屏表面(Off-screen Surface)中实现的。
在这种新的方式中,元素的背景变得不再是必须的。比如,我们希望在窗口中显式一个文字字符串,通常,在Win32或者Windows Forms中显式的效果如同一个静态文本标签一样:它具有系统默认的控件背景色。而在WPF中,文本字符串会直接画到目标位置,而不管目标区域的背景颜色。
在Windows Vista中,GDI和GDI+仍然支持,但是基本上没有任何功能性的改进。对GDI和GDI+的改进主要集中在安全性和客户相关问题上。在Windows Vista中,GDI、GDI+和WPF并行存在,WPF的所有提交都不依赖于GDI和GDI+,而是Direct3D。并且所有的Primitive都是通过Direct3D的本地接口实现的。WPF系统中Milcore组件,它以非托管代码的形式封装了与Direct3D交互的所有功能。由于WPF的大部分代码都是以托管代码的形式存在的,所以WPF中有很多托管、非托管的交互。当然,在一些图形卡不支持WPF所需要的功能时,WPF也提供了稍微低效的软件实现来支持在某些PC上运行WPF应用程序。
在WPF的实现中,每个画图对象都对应于一个离屏表面。显式窗口时不是直接地在屏幕显式区域进行的,而是利用显式卡提供的额外的离屏表面内存中。当画图操作在离屏表面中完成了之后,合成提交引擎再把每个需要显式离屏表面合成为一个单独的可显式表面。这种显式方式不再需要我们用传统的双缓冲绘图来避免窗口闪烁,这项功能已经有WPF默认实现了。
同时,离屏表面的使用也可以更加方便的利用显式卡GPU(图形处理单元,Graphics Processing Unit)来实现放索、旋转、变换等等。这也就意味着这些普通的3D功能也能很方便的在WPF中实现了。
关于离屏表面需要注意一点:不要错误的理解为WPF一定需要使用现代的图形显式卡(具有丰富功能的3D显式卡)。的确,在将来实现真正的3D用户界面是可能的。但是,WPF做了很大的努力来充分的利用GPU,把3D的元素抽象、封装后,让人们用类似2D的编程来实现3D的功能。
当前版本的WPF中,对一些Win32功能还没有很好的支持,比如WMF/EMF文件,单个象素宽度的线条等等。对于这些需求还需要使用GDI/GDI+来实现。

 

你可能感兴趣的:(WPF优点之比较GDI,GDI+)