WPF结构、图形支持与DirectX学习

 

    Windows 呈现基础(Windows Presentation FoundationWPF)是一个用于Windows平台的全新的图形显示系统。WPF是针对.NET而设计的,它受现代显示技术,如HTMLFlash,以及硬件加速技术的影响。WPF也完全不同于自从Windows 95以来一直使用的Windows用户界面。

    本章将介绍WPF的体系结构,首先会介绍WPF的工作原理,以及它如何为开发下一代Windows应用程序提供支持。

1.1  理解Windows图形

    15年以来,Windows开发人员一直在使用本质上相同的显示技术,如果您不了解这一实际情况,那么就很难理解WPF的变化有多么大。标准的Windows应用程序依赖于Windows操作系统的如下两个部分来创建用户界面,这两个部分已经使用了很长时间:

       User32  该部分为许多元素提供了类似的窗口外观,如窗口、按钮、文本框等。

       GDI/GDI+  该部分为渲染简单形状、文本以及图像提供绘图支持,但是非常复杂(而且通常性能较差)

    在过去的几年里,这两种技术一直在改进,并且开发人员使用的与之交互的API也已经发生了很大的变化。但不管是使用.NETWindows窗体,还是使用过去的Visual Basic 6或基于C++代码的MFC,在底层都是使用Windows操作系统的相同部分来工作的。新的框架工具为使用User32GDI/GDI+进行交互提供了更好的封装。这些框架工具提高了开发效率,降低了复杂性,并且提供了更多的特性,使开发人员不必再自己编写底层代码,但是这些框架工具不可能避免系统组件在设计上的基本限制,这些限制已经存在了十多年。

注意:

    User32GDI/GDI+的基本版本是在15年之前引入的,它们是在Windows 3.0中建立的。当然,User32在那时简化了用户操作,因为那时软件还未进入32位的世界。

1.1.1  DirectX:新的图形引擎

    Microsoft针对User32GDI/GDI+库的限制,提供了一个解决方案:DirectXDirectX开始作为一个附加的工具包,用于在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 ModelWDDM)。相对于Windows XP的显示驱动模型(Windows XP Display Driver ModelXPDM)WDDM提供了几处非常重要的改进。其中最重要的改进是,WDDM允许几个GPU操作立刻执行,并且当所需的显存量超出所能得到的显存量时,允许显存内容整页面地转到常规内存中。

    作为首要的通用规则,WPF200411月之后创建的所有WDDM(Windows Vista)驱动和XPDM(Windows XP)驱动提供了几类硬件加速功能,200412月,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属性的其他位来保存对其他特性支持的信息,从而创建子渲染级别。

        有关tier1tier2硬件加速的更多WPF特性,以及常见的tier1tier2显示列表,请访问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学习内容: 

 

00[序言]

3D图形技术的发展阅读全文>

 

01[初识Direct3D]

初识Direct3D, 页面切换, 万能的顶点阅读全文>

 

02[并非3D的3D]

3D pipeline, 3D物体的例子阅读全文>

 

03[谁把我挡住了]

Z缓冲器算法, 扫描线算法, 多边形明暗过渡及阴影生成算法阅读全文>

 

04[动起来更精彩]

向量, 矩阵, DirectX Graphics中矩阵函数的作用阅读全文>

 

05[3D中的太阳]

光照明模型的由来, 局部光照明模型, 整体光照明模型, 光线跟踪算法阅读全文>

 

06[纹理映射技术]

二维纹理映射, 特殊纹理映射, 纹理映射中的反走样阅读全文>

 

07[基本3D模型构造]

顶点索引, 基本3D几何模型, 基本地形模型, 基本3D模型的例子阅读全文>

 

08[Mesh]

ID3DXMesh中的信息, ID3DXMesh的存储及读取, ID3DXPMesh(ID3DXSPMesh), Mesh的例子阅读全文>

 

09[那是什么鬼东西]

逆转换, 它是谁, ID3DXFont, Pick的例子阅读全文>

 

10[粒子系统的实现]

粒子系统的实现, 粒子系统的例子阅读全文>

 

11[粒子系统的实际应用]

Snow, 简单的喷泉, 简单的烟花, 简单的烟雾, 雷射光线, 粒子系统实际应用的例子阅读全文>

 

12[红+绿+蓝+Alpha]

色彩, Alpha Test, Alpha Test例子, Alpha Blend, Alpha Blend例子阅读全文>

 

13[多重纹理技术]

Texture Stage, Texture Blending Cascade, 输入参数和混合类型, 简单混合实现, 单层混合的例子, 多层混合阅读全文>

 

14[多重纹理的应用]

dark & light mapping, detail mapping, Dark mapping & Detail mapping的例子, glow mapping, 多重纹理的多效果例子阅读全文>

 

<From: http://blog.csdn.net/Jaredz>

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值