Silverlight中提供了StoryBoard实现动画,可是StoryBoard的性能实在不敢恭维,特别是动画很大的时候,计算机的CPU和内存的狂增,如此一来性能实在太差,在默认的动画效果中动画实现的效果是 根据每分钟 60帧(标准的是一分钟60帧,即一秒一帧来实现动画的呈现),不过这个过程我们不用担心因为是Silverlight自己计算好的来完成一个好的动画。废话不多说,开始看看有哪几种方式可以来对动画进行优化:
一、使用Object标签的maxFramerate属性
该属性的默认值就是60,当然也就是标准的,看看怎么设置
没错,就是这么简单,当value值越小(小于标准的60)动画的速度就越快(因为每一秒的帧数变大了),当值越大则速度越来越慢
<param name="maxFramerate" value="15"/>
另外,为了达到好的性能,最好少使用透明度,已经动画的文本字体大小,以及使用WindowLess的设置显示Html。
二、硬件加速(GPU加速)
这个听起来很复杂,的确实现真正的GPU是很复杂的做法,不过不用担心,Silverlight中支持了我们对此功能的设置,非常简单
<param name="enableGPUAcceleration" value="true"/>
三、图形的缓存
图形的缓存存在一些限制,仅仅对以下几种操作有效:
1.ScaleTransform一个图形
2.RotateTransform一个图形
3.使用图形的Opacity属性
4.使用图形的Clip属性
首先介绍下,实现图形缓存加速的原理"GPU硬件加速是使用合成缓存将可视元素或元素的可视化树缓存为位图图面的行为。这可能为某些方案带来重大的性能改进。使用缓存合成,您可以在可视元素第一次呈现之后,将其缓存为位图。在将某个对象或对象树缓存为位图之后,当应用程序刷新时,它不再经过呈现阶段,而是只呈现缓存的位图。此类缓存位图交换可以充分利用用户 GPU 中提供的硬件加速功能,这种方法会大大改进某些方案的性能。"
实现缓存的方法:
设置元素的CacheMode属性,其中BitmapCache属性的重点,该值表示缓存中图形相对于原元素的比例,默认值为1,即和元素大小一致,数值越小CPU占用越少,内存占用越少,性能越好,反之则越坏。
<Button x:Name="cmd" Content="I GROW and SHRINK." Canvas.Top="70" Canvas.Left="10">
<Button.CacheMode>
<BitmapCache RenderAtScale="5"></BitmapCache>
</Button.CacheMode>
<Button.RenderTransform>
<ScaleTransform x:Name="scaleTransform"></ScaleTransform>
</Button.RenderTransform>
</Button>
四、加速测试,在开发过程中可以测试是否起到了加速优化的效果
第一个属性为GPU的加速,后两个是用于在页面上显示当前使用的速率和缓存以及显示内存的一些信息。
<param name="EnableGPUAcceleration" value="true"/>
<param name="enableCacheVisualization" value="true"/>
<param name="enableFrameRateCounter" value="true"/>
下图显示为使用了三个属性后页面的测试效果:
第一个数字为当前动画的速率;
第二个数字为当前占用内存的字节数;
三四个数字不太理解这个意思。