时间:2010-06-24 11:54来源:博客园 作者:深蓝色右手 点击:
278次
Silverlight3 发布时,我和朋友都为其新增的 GPU 硬件加速功能激动不已,于是开始了肆无忌惮的连夜测试,可结果却实在让我们大失所望。是的,不论怎样修改代码都无法感觉到明显的性能提升。接下来的日子里, GPU 这个词渐渐的远离了我的脑海。
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与测评,我相信这才是本文最激动人心时刻的开始:
下面是我的测试环境及结果---------------------------------------
机器配置:
这是一台目前市面最最普通的行政级办公电脑,测试结果:
环境:浏览器1024*768(全屏),单位图片150*150(像素) | ||||||
测试结果(对象:500精灵) |
动画方式
|
GPU启动
|
OOB模式
|
FPS
|
CPU消耗(%)
|
内存占用(M)
|
动画效果
|
Canvas位移
|
否
|
否
|
1.93
|
92
|
59
|
比较卡
|
是
|
否
|
24.58
|
45
|
110
|
相当流畅
|
|
否
|
是
|
|
92
|
39
|
比较卡
|
|
是
|
是
|
|
45
|
92
|
相当流畅
|
|
TranslateTransform位移
|
否
|
否
|
1.65
|
92
|
65
|
非常卡
|
是
|
否
|
3.7
|
65
|
115
|
比较卡
|
|
否
|
是
|
|
92
|
41
|
非常卡
|
|
是
|
是
|
|
65
|
98
|
比较卡
|
|
透明度(Opacity)变化
|
否
|
否
|
7.37
|
92
|
58
|
比较正常
|
是
|
否
|
36.25
|
45
|
107
|
相当流畅
|
|
否
|
是
|
|
92
|
42
|
比较正常
|
|
是
|
是
|
|
38
|
92
|
相当流畅
|
|
可见性(Visibility)变化
|
否
|
否
|
14.92
|
20
|
54
|
逐个闪烁
|
是
|
否
|
3.19
|
30
|
110
|
整齐连续
|
|
否
|
是
|
|
20
|
37
|
比较闪烁
|
|
是
|
是
|
|
30
|
94
|
整齐连续
|
|
三维(PlaneProjection)变换(对象仅为整体容器)
|
否
|
否
|
11.16
|
92
|
61
|
正常
|
是
|
否
|
7.79
|
85
|
63
|
正常
|
|
否
|
是
|
|
|