问题
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 枚举,因为鱼只有一个方向的动作,需要通过反转来实现另一方向的动作。