Welcome

首页 / 软件开发 / Silverlight / GPU硬件加速下Silverlight超性能动画实现(上)

GPU硬件加速下Silverlight超性能动画实现(上)2013-11-15 博客园 深蓝色右手Silverlight3发布时,我和朋友都为其新增的GPU硬件加速功能激动不已,于是开始了肆无忌惮的连夜测试 ,可结果却实在让我们大失所望。是的,不论怎样修改代码都无法感觉到明显的性能提升。接下来的日子里, GPU这个词渐渐的远离了我的脑海。直至几天前,在与一位朋友交流后又再次让我萌生去测试GPU硬件加速在 Silverlight4中效果的想法。真乃不测不知道,一测吓一跳。在最近Silverlight贬低声此起彼伏的日子里, 我相信这篇文章及测试结果必将成为Silverlight开发中最为强劲的春哥!没错,信则永生!

既然要用GPU硬件加速,那么我们首先得知道它的定义原理及作用,大家可以参考MSDN的相关介绍,下面是 我精简的核心内容:

GPU硬件加速是使用合成缓存将可视元素或元素的可视化树缓存为位图图面的行为。这可能为某些方案带来 重大的性能改进。使用缓存合成,您可以在可视元素第一次呈现之后,将其缓存为位图。在将某个对象或对象 树缓存为位图之后,当应用程序刷新时,它不再经过呈现阶段,而是只呈现缓存的位图。此类缓存位图交换可 以充分利用用户 GPU 中提供的硬件加速功能,这种方法会大大改进某些方案的性能。

接下来,要启动Silverlight中的GPU硬件加速首先必须进行参数设置:

1)在Silverlight页面对象中加入参数<param name="EnableGPUAcceleration" value="true" />

2)为需要使用GPU加速的Uelement对象设置CacheMode值,比如:

Xaml:

<MediaElement>
<MediaElement.CacheMode>
<BitmapCache RenderAtScale="4"/>
</ MediaElement.CacheMode>
</MediaElement>

或C#:

MediaElement mediaElement = new MediaElement () {CacheMode = new BitmapCache() { RenderAtScale = 4 } };

其中BitmapCache缓存中的RenderAtScale指明将对象呈现为已缓存位图时所使用的缩放比例。如果您将其 指定为负数,则会引发错误。默认值为1。注意:RenderAtScale越小CPU消耗越少,内存占用越少,即性能越 好!另外,RenderAtScale在介于0到1之间时,位图呈现为模糊状态。或许有朋友会问:游戏开发中我们是否 能将之设置为0.8左右,不仅能模糊边缘且不失太多像素,又能提高性能,当然这还有待进一步测试。

最后,我们还得了解GPU硬件加速所适用的范围。针对目前的Silverlight4版本,我们可以对Transform、 RectangleGeometry 、Opacity、Visibility、Projection、DeepZoom等对象进行GPU硬件加速。其中从 Transform派生的对象包含:RotateTransform、ScaleTransform、SkewTransform、TranslateTransform、 MatrixTransform、TransformGroup;而Projection (三维透视) 派生的对象包含PlaneProjection和 Matrix3Dprojection。

值得一提的是,Silverlight对Projection和DeepZoom的GPU硬件加速支持是在4版本中才新增的,从这点我 们可以预测到Siverlight未来的发展趋势:Web3D硬件加速将在Silverlight后续版本中得到完美支持!

以上是关于Silverlight中GPU硬件加速方面的理论精华浓缩,接下来是我专门为测试Silverligh4中GPU硬 件加速功能所编写的Demo与测评,我相信这才是本文最激动人心时刻的开始:

Demo在线演示地址:http://silverfuture.cn/Demos/demo1.html

下面是我的测试环境及结果---------------------------------------

机器配置: