wpf mvvm框架的原理和好处?
对于一般程序语言,执行分为3种:
1)编译成二进制机器代码,由操作系统调用执行;典型的如C,C++,Delphi等.
2)编译成中间语言,由虚拟机解释来执行或及时编译后执行(前者的典型是java,后者的典型是DotNet).
3)不进行编译,有解释器边解释边执行,比较典型的是VB和HTML,Javascript.等
上边这些与WPF有关系么?其实是有的,至少原理上非常相似.我们来看看WPF的XAML的执行机制:
1)首先是实例化页面类;
2)然后构建界面元素(控件树),这里很关键,因为xaml文件里有界面元素的描述性信息,对于一个界面元素E:
A)首先实例化E,知道界面元素的类名,利用反射机制很容易实例化该类.
B)设置属性,同样利用反射机制,将字符串描述的属性值设置赋给实例,这个原理很简单,但要做得很好,是需要一个简单的解释器的.
C)属性可以挂接,事件也当然可以动态挂接,但一般情况下,事件挂接时目标方法只能在页面实例里。
D)到此,一个界面元素就内存实例化了,然后放入当前页面的控件树里。实例化界面元素本来就是递归完成的,控件树的完成比较容易。
当然最后,会将有Name的元素实例赋给页面类实例里相应的成员变量,这样页面代码方法里应用该控件的代码就能正常执行了。这种执行机制与上面提到的3种方式中的第3种方式非常类似。页面元素属性(包括事件)的描述和具体页面代码分开的方式,很多地方都采用,比如Aspx,Dfm等。
有人说WPF比winform强大很多,可为什么很少转的?
WPF比Winform强大的说法,并不确切。首先,WPF将Winform的绝大部分功能,用另外的更复杂臃肿的方式重新封装和实现了一遍。其次,对特定问题推荐了一些新的技术方案和框架,要重新学习。而且效果不一定更好。第三,为了适应新的操作系统,扩展提供了一些新特性。而微软新操作系统,针对平板和手机触屏的优化,反而让桌面程序更难于使用。通常我们都要开发兼容XP旧系统的程序,因此这部分新特性几乎没有什么实际作用。总体而言,完成同样的任务用WPF比用Winform更复杂、更慢、更臃肿了。占用更多的内存,提供更慢的运行速度。所谓强大的新技术,并不能转化为生产力。旧方案大部分也可以很好完成。针对手机和平板的新特性,随着微软移动份额逐渐趋向于零,而像裹脚布一样几乎无用武之地。但是,微软开发平台的winform已经很久没有维护改进了。新入门者可以直接学WPF,未来会更贴近时代。如果已经掌握了winform,那就没必要转WPF,因为转换短期内获益不大。
WPF如何提升三维呈现性能及优化?
一、图形硬件加速
wpf中的图形呈现都是通过图形卡的GPU来进行计算处理的,一般WPF 系统定义了三个呈现层:呈现层 0 无图形硬件加速。DirectX 版本级别低于 7.0;呈现层 1 部分图形硬件加速。DirectX 版本级别高于或等于 7.0 且低于 9.0。视频 RAM必须大于或等于30MB。多纹理单元单元数必须大于或等于 2(显卡AGP速率2X);
呈现层 2 大多数图形功能都使用图形硬件加速。DirectX 版本级别高于或等于 9.0。视频 RAM必须大于或等于120MB。多纹理单元单元数必须大于或等于 4(显卡AGP速率4X或更高8X、16X)。
二、三维模型材质的使用
一般三维模型材质的使用,多数会用到Brush,但不同的Brush材质呈现的速度也不同,SolidColorBrush(直接给模型添加固有色) 、LinearGradientBrush 相对于ImageBrush、VisualBrush等运算速度要快得多,已缓存的Brush比未缓存的Brush快。
三、模型的创建
在三维场景中我们尽量创建GeometryModel3D三角面片小于60.000个,顶点小于20.000个,尽量重复使用外形变化不大的模型,除非有新形状需要从新创建模型,尽量在一个viewport3D中创建子模型不要创建多个viewport3D。
四、关于3d抗锯齿
wpf中的3d抗锯齿,只适合于vista系统,如果想在xp系统下实现抗锯齿,可以在注册表中设置最大多级采样值 HKEY_CURRENT_USER/SOFTWARE/Microsoft/Avalon.Graphics/MaxMultisampleType 值类型为DWORD一般设为4 根据显卡的性能进行合适的调整。(不过建议最好不使用这种方法,使用修改注册表可以实现抗锯齿,但同时也可能会产生新的呈现问题,比如:三维模型体贴与其他对象重叠产生图形边缘出现虚线等,不过通过设置显卡的代替像素中心功能可以解决虚线问题,但同时也会带来其他不可预知的不稳定因素)
所以根据自己对三维呈现的实际展现要求可以灵活选择优化设置的方法,目的只要一个就是要保证具有稳定、优良的性能又有很好的三维呈现效果。