Windows呈现基础(Windows Presentation Foundation,WPF)是一个用于Windows平台的全新的图形显示系统。WPF是针对.NET而设计的,它受现代显示技术,如HTML和Flash,以及硬件加速技术的影响。WPF也完全不同于自从Windows 95以来一直使用的Windows用户界面。
本章将介绍WPF的体系结构,首先会介绍WPF的工作原理,以及它如何为开发下一代Windows应用程序提供支持。 1.1 理解Windows图形 15年以来,Windows开发人员一直在使用本质上相同的显示技术,如果您不了解这一实际情况,那么就很难理解WPF的变化有多么大。标准的Windows应用程序依赖于Windows操作系统的如下两个部分来创建用户界面,这两个部分已经使用了很长时间: ● User32 该部分为许多元素提供了类似的窗口外观,如窗口、按钮、文本框等。 ● GDI/GDI+ 该部分为渲染简单形状、文本以及图像提供绘图支持,但是非常复杂(而且通常性能较差)。 在过去的几年里,这两种技术一直在改进,并且开发人员使用的与之交互的API也已经发生了很大的变化。但不管是使用.NET和Windows窗体,还是使用过去的Visual Basic 6或基于C++代码的MFC,在底层都是使用Windows操作系统的相同部分来工作的。新的框架工具为使用User32和GDI/GDI+进行交互提供了更好的封装。这些框架工具提高了开发效率,降低了复杂性,并且提供了更多的特性,使开发人员不必再自己编写底层代码,但是这些框架工具不可能避免系统组件在设计上的基本限制,这些限制已经存在了十多年。 注意: User32和GDI/GDI+的基本版本是在15年之前引入的,它们是在Windows 3.0中建立的。当然,User32在那时简化了用户操作,因为那时软件还未进入32位的世界。 1.1.1 DirectX:新的图形引擎 Microsoft针对User32和GDI/GDI+库的限制,提供了一个解决方案:DirectX。DirectX开始作为一个附加的工具包,用于在Windows平台上开发游戏。DirectX在设计上主要关注的是速度,为此,Microsoft和显卡供应商紧密合作,以便为DirectX提供复杂的纹理映射、特殊效果(如半透明)以及三维图形所需要的硬件加速功能。 在DirectX第一次发布(在Windows 95发布之后不久发布)的几年后,DirectX就变得很成熟了。现在DirectX已经成为Windows的组成部分,支持所有现代的显卡。然而,DirectX编程API,正如最初设计它的目的,仍然主要是作为游戏开发人员的工具包。因为它本来就很复杂,所以DirectX几乎不用于传统类型的Windows应用程序(如商业软件)。 WPF改变了这一现状。在WPF中,底层的图形技术不再是GDI/GDI+,而是DirectX。需要强调的是,不管创建哪种用户界面,WPF应用程序在底层都是使用DirectX。这意味着不管是设计复杂的三维图形(这是DirectX的特长),还是仅仅绘制几个按钮以及简单的文本,所有的绘图工作都是通过DirectX管线来完成的。因此,即使是最普通的商业应用程序也能够使用丰富的效果,如半透明和反锯齿。使用WPF还可以受益于硬件加速,DirectX在渲染图形时会将尽可能多的工作交给GPU(图形处理单元)进行处理,WPF简化了这一过程,GPU是显卡专用的处理器。 注意: 因为DirectX能够理解高层的元素,如纹理和渐变,这些要素可以由显卡直接渲染,所以DirectX更加高效。而GDI/GDI+不理解这些高层的元素,所以需要将它们转换成逐像素指令,而用现代显卡渲染这些指令是非常慢的。 User32在一定程度上仍然被保留了下来。因为对于特定的服务,WPF仍然依赖于User32,例如,处理和传递输入以及区分哪个应用程序实际拥有屏幕的哪一部分。但是,所有的绘图操作都是由DirectX完成的。 注意: 对于GDI/GDI+,WPF不再是一个封装器,而是一个通过DirectX工作的独立层次,这是在WPF中最重要的变化。 1.1.2 硬件加速与WPF 您可能知道显卡在支持特定渲染特性和优化方面的区别。当使用DirectX进行编程时,这可能是最令人头痛的问题。而使用WPF则可以不必关心显卡的问题,因为通过使用软件计算而不依赖显卡提供的内在支持,WPF可以执行任何渲染操作。 注意: 对于WPF软件支持有一个例外。因为驱动程序的支持不够好,只有在Windows Vista(并且在本地安装有Windows Vista显卡驱动程序)上运行应用程序时,WPF才会为三维绘图操作提供反锯齿处理。也就是说,如果在安装Windows XP的计算机上绘制三维图形,最终的图形边缘会有轻微的跳动而不是平滑的直线。对于二维绘图,WPF仍然提供反锯齿处理,而不管使用的是哪种操作系统,也不管驱动程序是否支持。 具有一块功能强大的显卡并不能保证在WPF中一定能获得硬件加速功能。软件仍然具有非常重要的作用。例如,如果使用过期的驱动程序,WPF就不能为显卡提供硬件加速功能(如果使用老显卡,这些过期的显卡驱动很有可能是在零售发布包中提供的)。在Windows Vista操作系统中,WPF可以提供更好的性能,因为WPF可以充分利用新的Windows Vista显示驱动模型(Windows Vista Display Driver Model,WDDM)。相对于Windows XP的显示驱动模型(Windows XP Display Driver Model,XPDM),WDDM提供了几处非常重要的改进。其中最重要的改进是,WDDM允许几个GPU操作立刻执行,并且当所需的显存量超出所能得到的显存量时,允许显存内容整页面地转到常规内存中。 作为首要的通用规则,WPF为2004年11月之后创建的所有WDDM(Windows Vista)驱动和XPDM(Windows XP)驱动提供了几类硬件加速功能,2004年12月,Microsoft发布了新的驱动程序开发指导原则。当然,支持的程度是有所不同的。当WPF基础架构第一次出现的时候,通过在显卡旁边印上“WPF Tiers”来评价显卡的性能,并对显卡从0级到2级进行分级。 作为WPF承诺的一部分,不必担心特定硬件的细节和功能。WPF非常智能,它会尽可能地利用硬件优化功能,并且为任何操作提供了软件处理底线。所以如果在一台使用老显卡的计算机上运行WPF应用程序,仍然会以您所期望的方式显示用户界面。当然,使用软件处理的替代方法,速度会非常慢,所以在使用老显卡的计算机上不能很好地运行WPF应用程序,特别是那些包含复杂动画或其他强大图形效果的WPF应用程序。实际上,可以根据客户端硬件加速所支持的程度(由RenderCapability.Tier属性指示),来减少用户界面中复杂的特殊效果。 注意: WPF的目标是将尽可能多的工作交给显卡处理,所以复杂图形通常属于渲染范围(由GPU处理)而不属于处理器范围(由计算机的CPU处理)。也就是说,可以让CPU空闲下来去完成其他工作,充分利用显卡的功能,并且还可以充分利用未来新显卡所具备的不断增加的新功能。 WPF渲染级别(WPF TIERS) 显卡功能的区别是非常重要的。当WPF访问显卡时,它会考虑许多因素,包括显卡上RAM的数量、对像素着色器(pixel shader)的支持(显卡提供的计算每个像素效果的程序,如透明效果),以及对顶点着色器(vertex shader)的支持(显卡提供的计算每个三角形顶点数值的程序,如3D对象的着色)。根据这些细节,WPF会指定一个渲染级别值。 WPF提供了三个渲染级别,如下所示: ● Rendering Tier 0:显卡将不提供任何硬件加速功能。该级别和7.0或更低版本的DirectX相对应。 ● Rendering Tier1:显卡可以提供部分硬件加速功能。该级别和7.0以上9.0以下版本的DirectX相对应。 ● Rendering Tier2:所有的特性都将被硬件加速。该级别和DirectX 9.0及以上版本相对应。 在某些情况下,可能想通过程序来检查当前显卡的渲染级别,从而可以有选择地为功能较差的显卡禁用一些图形特性。为此,需要使用System.Windows.Media.RenderCapability类的Tier静态属性。但是还需要一个技巧。为了通过Tier属性检查显卡的WPF渲染级别值,需要将它移动16位,如下所示: int renderingTier = (RenderCapability.Tier>>16);
if(renderingTier == 0) { … } else if(renderingTier == 1) { … } 这种设计在以后可以进行扩展。在WPF的后续版本中,可以使用Tier属性的其他位来保存对其他特性支持的信息,从而创建子渲染级别。 有关tier1和tier2硬件加速的更多WPF特性,以及常见的tier1和tier2显示列表,请访问http://msdn2.microsoft.com/en-gb/library/ms742196.aspx 或者:http://lzg-ad.blog.sohu.com/120007931.html
WPF的结构
其中红色显示的组件是WPF的核心。Milcore是一个和DirectX交互的非托管组件,非托管代码能带给我们更高效的处理,能更好的和DirextX交互。WPF的所有显示都是由Dirext完成的。milcore中一个非常重要的功能就是Composition引擎,这个引擎对效率的要求很高。所以milcore放弃了一些CLR的特征来换取效率。而另外两个红色的组件都是建立在CLR基础之上,利用了.NET的优势。
至于其中的User32组件有什么作用,偶目前的知道的就是在WPF的某些应用场景中为了某些兼容需要使用User32,其中就有DWM(桌面窗口管理)。DWM的内容又可以写上一大堆,感兴趣的朋友可以看SDK文档。
我们除了关心WPF的基本结构外,更重要的 是WPF提供了什么功能,请看下图:
图中的每个黄色块都是一种媒体类型。这就表示WPF可以处理几乎所有的媒体类型:位图、3D、音频、视频和文本等等。通过WPF,它集成了现在的GDI/GDI+、D3D/OPENGL以及多媒体的DSHOW等等。所有的东西都是等同对象,不管的3D还是2D,或者文本。
结构图中的Animate块贯串了整个的结构,因为在WPF中我们可以对所有的可视内容进行动画操作。这是非常让人期待的功能。Animate下面我们再次看到了Composition引擎,前面提到过它是位于milcore组件中。开发过程中,我们的界面元素功能有多种,比如图片,视频等等,最后显示到窗口的内容可以认为只是一张图片(准确说是Surface)。这个引擎的作用就是合成这些图片和视频元素最后进行提交显示。
DirectX学习内容:
3D图形技术的发展
初识Direct3D, 页面切换, 万能的顶点
3D pipeline, 3D物体的例子
Z缓冲器算法, 扫描线算法, 多边形明暗过渡及阴影生成算法
向量, 矩阵, DirectX Graphics中矩阵函数的作用
光照明模型的由来, 局部光照明模型, 整体光照明模型, 光线跟踪算法
二维纹理映射, 特殊纹理映射, 纹理映射中的反走样
顶点索引, 基本3D几何模型, 基本地形模型, 基本3D模型的例子
ID3DXMesh中的信息, ID3DXMesh的存储及读取, ID3DXPMesh(ID3DXSPMesh), Mesh的例子
逆转换, 它是谁, ID3DXFont, Pick的例子
粒子系统的实现, 粒子系统的例子
Snow, 简单的喷泉, 简单的烟花, 简单的烟雾, 雷射光线, 粒子系统实际应用的例子
色彩, Alpha Test, Alpha Test例子, Alpha Blend, Alpha Blend例子
Texture Stage, Texture Blending Cascade, 输入参数和混合类型, 简单混合实现, 单层混合的例子, 多层混合
dark & light mapping, detail mapping, Dark mapping & Detail mapping的例子, glow mapping, 多重纹理的多效果例子
|
|