引言
Silverlight从第3个版本开始便将GPU硬件加速和OOB(Out of Browser)模式作为全新内容添加进框架中;随着第4个版本的发布,GPU硬件加速所支持的范围与性能提升效果以及OOB模式更完美的功能改进再次让我感受到Silverlight这个茁壮成长中的苗子那巨大的发展潜力。本节我将向大家讲解如何将这两个伟大的特性添加进课程游戏Demo中,并一同探讨其相关知识。
5.1合理运用GPU硬件提升游戏整体性能(交叉参考:GPU硬件加速下Silverlight超性能动画实现(上) GPU硬件加速下Silverlight超性能动画实现(下) )
在将GPU硬件加速功能加入进游戏Demo之前我们不妨先来看张图片:
这是我从Silverlight4脱机文档中截出来的关于Silverlight硬件加速的使用说明。首先申明本人不是闲着蛋痛,只想借此机会同时告诉更多朋友:Silverlight发展至今掐掐手指已有几年,但仍算是新的产品;它的功能就像他的版本一样发展迅速并逐步走向成熟;更重要的是如果作为一名认真负责的Silverlight应用开发者,如果您都未能熟读Silverlight文档就好比新手开奔驰,做出来的产品仅仅处于一个“能用”的水平,更容易造成外行人心理不是滋味:“原来‘奔驰’性能不过如此,CPU乱蹦乱跳,卡得要死”尔尔。
因此,以上图关于Silverlight中GPU硬件加速为例,我们不仅可以从中了解Silverlight中GPU硬件加速的大致原理,使用方法及适用范围,以及使用的注意事项与版本4新增支持等等;同时在与其他RIA类似功能进行对比后我们更能总结出Silverilght中的GPU硬件加速对象具体到了UElement,是高度自由可控且性能提升效果明显而实实在在的硬件加速,它不仅能作用于视频,同时对于游戏的渲染来说效果同样显著。比起仅能依靠浏览器GPU加速功能的HTML5+Javascript不仅代码安全性高,而且依赖性低,更何况HTML5是何物?标准制订中…;同样比起Flash10,Silverlight的GPU在使用方面自由度高,管理起来更方便。
Silverligh 5 这个传说中更为强势的版本正在如火如荼的开发中,从广大的Silverlight爱好者对官方的建议我们不难看出或许这将是更为让世界惊叹的一次全新演绎,我与大家一同分享着这份等待的心情,性能更高、支持领域更广泛的GPU硬件加速功能或将成为新版本亮点中的明星。
言归正传,在Silverlight中使用GPU最直接目的就是大幅度降低CPU的资源占用率,节省对CPU 资源的开支以让CPU可以做更多其他的事情。众所周知,降低CPU的负荷以减少电池消耗这是手机等移动设备所高度关注的,Silvelight比起其他RIA在这方面能做得更好,因此Silverlight成为Windows Phone 7等设备的主要开发平台这是有客观事实所支持的。
于是,接下来我们的任务就是依据Silverlight文档中使用GPU硬件加速的方法,将该功能添加进我们的游戏Demo中。
首先是为Silverlight宿主页面添加启动GPU等参数:
<param name="EnableGPUAcceleration" value="true" />
<param name="EnableCacheVisualization" value="true" />
<param name="MaxFrameRate" value="40" />
<param name="EnableFrameRateCounter" value="true" />
其中第一行是关键,告诉Silverlight应用程序可以使用GPU硬件加速。注意了,这里仅仅是说可以使用。
第二行是启用GPU硬件加速缓存验证,即将使用了硬件加速及没使用硬件加速的对象用颜色区分显示。
第三行限制Silverlight应用程序的最大刷新频率,这里我设置为40代表每秒画面刷新次数最大为40;然而这并不是必然的,Silverlight会根据实际情况当CPU本身负荷不大而需要同时呈现的对象变化频繁时它会在一定时间内将刷新率超过最大值约50%不过以提升画面的流畅性,这方面我们无法控制。
第四行启动画面帧率统计。
以上参数大家均可以在Silverlight4脱机文档中查找到相关介绍与说明。
那么剩下的工作就是为需要用到GPU硬件加速的对象添加类似如下代码:
public Sprite() {
this.CacheMode = new BitmapCache();
……
}
如果你不需要动态对某个对象开/关GPU硬件加速,那么完全可以像上面那样在对象类的构造函数中添加this.CacheMode = new BitmapCache();这句就OK;当然,需要关闭某个对象的GPU硬件加速时将它的CacheMode = null即搞定。
最后大家需要特别注意一个问题:GPU硬件加速必须放到合理的地方方能发挥最大作用;如果使用不当则极有可能造成性能反降,好比以错误的秘籍修炼葵花宝典-“就算自宫也未必成功”。最好也是最安全的办法即是对每个可能要用到加速的类逐个测试启动GPU硬件加速,并进行大规模实例化后对比之前未加速时的性能进行对比测试。办法是笨了些,但着实有用,最直接的例子就是对整个游戏场景进行GPU加速性能会比没加速前还低N倍,这也启示了我们一个使用时的基本准则:对越具体的对象启动GPU硬件加速才是正道。
5.2通过OOB(脱离浏览器运行)模式拓展应用领域(Silverlight实例教程Out-of-Browser应用开发汇总)
OOB (Out of Browser)模式可以让 Silverlight像 Windows 普通程序那样运行于浏览器之外。简单说来即安装在本地机器上,同时拥有更大的操作权限,具体内容大家可以参考Silverlight文档中关于OOB模式的说明。
将OOB模式应用到我们的游戏Demo中同样是一件轻松的事情,只需两步:
1、点击Silverlight游戏项目,选择“属性”,此时在弹出的对话框中勾选“允许在浏览器外运行应用程序”:
2、通过点击“浏览器外设置”我们可以对OOB模式时的一些游戏设定进行修改,比如说标题,窗口出现位置、尺寸,快捷方式的名称以及在安装提示、桌面、开始菜单、添加/删除面板等位置的Icon图标等等:
另外,如果为游戏设置了OOB模式,当启动项目修改为Silverlight程序时每次运行时游戏都将会以OOB模式启动而不是网页形式。
本课小结:本课没有太多实质性新增代码,然而却又是Silverlight游戏开发所必不可少的两个重要环节;同时也希望大家在做开发前把基础掌握好,只有当你不断的深入Silverlight内部你才会发现更多更优美的解决方案;实现功能仅仅是个开始,谨记一点:搭建Silverlight高性能游戏框架才是我们的不懈追求!
本课源码:点击进入目录下载
参考资料:中游在线[WOWO世界] 之 Silverlight C# 游戏开发:游戏开发技术
教程Demo在线演示地址:http://silverfuture.cn