代码改变世界

Silverlight 5 3d 游戏开发(3)1000条鱼

2011-06-09 12:45  老咩  阅读(1678)  评论(4编辑  收藏  举报

问题

Silverlight 5 相对Silverlight 4 是否有效率提升?能否使用一个案例来进行测试。

 

解决方案

深蓝色的右手写过 GPU硬件加速下Silverlight超性能动画实现(上) GPU硬件加速下Silverlight超性能动画实现(下)

而微软有一个测试 Html 5 的例子叫 Fishie tank

两者都可以拿来作为案例进行测试,相比较,Fishie tank 更合适一些。因为Fishie tank 采用的是直接绘制,和Silverlight 5 使用 DrawingSurface,调用GraphicsDevice 来直绘比较近似。

 

工作原理

改写Fishie tank 是比较容易的,将JavaScript 翻译成 c# 是个体力活。值得注意的是,微软Fishie tank 里用了一张图片来存储鱼的动作,这张图片的大小为4912*951,结果在Silverlight 5 里出错。Why?

回顾在第一章里,Silverlight 5 beta 版目前仅支持Reach profile 模式,最大纹理为2048,因此我将图片进行处理,最后缩减为2048*396。当然,这个纹理不是2的次方,当纹理类此于32,64,128,这样的2的次方大小时,显卡会渲染的更快一点。

有意思的是,xna 支持HiDef 模式,这个模式下最大纹理为 4096,而对于DirectX来说 DX9最大支持纹理是4096*4096,DX10是8192*8192,DX11是16384*16384。我使用IE 9,IE9只支持win 7,而win 7 又自带dx11(我使用的win 7 旗舰版本)。 所以这是微软Fishie tank 为什么可以用 4912*951大小的纹理的原因。

吐槽:由此可见Silverlight 5 beta 版本还是不给力啊。究其原因,Html 5 是公共标准,各种浏览器将会尽其所能的利用系统最大能力来渲染,否则就落后挨打。Silverlight 则只能期望浏览器对插件的支持是否给力,另外微软野心太大,兼容xna还要能在win phone 上运行,跨硬件平台的后果就是Silverlight 5 beta 版只能先实现最低期望值。

Fishie tank 通过绘制大量的鱼来测试性能速度。本质上这里和Silverlight 4 没有区别:我的意思是这里仅使用了显卡的 纹理 能力,Silverlight 5 相对于 4的区别,是还可以使用 显卡的 顶点能力。

不过即使是 纹理 ,通过测试,我也得到了一个比Silverlight4更快的结果。

我的配置为:

深蓝色右手的 测试Demo,500个精灵,100*100大小,我获得的fps速度为 5-6帧。

Silverlight 5  Fishie tank测试,500个精灵,获得的fps 速度为7 -8 帧。

(这个对比不是很公平,欢迎大家在自己机器上进行测试,并提出意见。)

当然,这1帧的进步,我认为其原因有2点:

第1,我们可以在Silverlight 5中使用直接绘制,避免了一些Silverlight 4 中的间接调用的开销。

第2,深蓝色右手使用轮换比裁剪快,是因为其裁剪没有通过硬件进行,Silverlight 5 中可以直接指定设备绘制纹理指定部分,这个裁剪工作由硬件设备负责。

代码

我稍微改了一下SpriteBatch,为其增加了一个
SpriteEffects 枚举,因为鱼只有一个方向的动作,需要通过反转来实现另一方向的动作。

源代码下载