动画性能与CompositionTarget.Rendering

一般的动画是通过改变对象的某个属性而达到渐变效果的,比如下图展示的动画分类表格,阐述的便是此类Property-Based动画。

相对的,Silverlight提供了只能用代码实现的Frame-Based动画,其用法非常简单,只需把相应处理函数绑(事件句柄)定到静态的CompositionTarget.Rendering事件即可。Silverlight便持续不断的触发该事件句柄(默认每秒60次),当动画结束时,记得解绑该事件句柄。该方法是较低级别的控制方式,除非标准的基于属性的动画不能满足需求时才考虑使用。(Pro Silverlight 3 书中动画 章节有示例)

此外,Frame-Based动画并非依赖于时间的,因此其渲染速率可能非常高(取决于不同的电脑),如果需要进行控制,要在代码中自己考虑时间问题。

动画尽管能够带来酷炫效果,但相对耗费性能,不过可以通过降低最大帧频(Frame Rate);开启硬件加速,让GPU帮CPU多承担些劳动量等方式来调整。

<param name="maxFramerate" value="15" /> //设置最大帧频。

<param name="enableGPUAcceleration" value="true" /> //开启硬件加速

<param name="enableCacheVisualization" value="true" /> //测试时,帮忙诊断是否性能有所提示

<param name="enableFrameRateCounter" value="true" /> //发布时,和上述参数可一并删除

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

但仅限于某些方案,比如缩放、旋转、透明度、矩形Clip等,也就是说当把动画应用上述几种情形时,将会从中受益。但要是用于要素扭曲,着色器,透视变换,颜色变换等,反而会降低性能。并且若设置容器的CacheMode属性,则其子元素都将在开启单独的位图缓存,因此使用时要特别注意。

此外,尽量不要对透明度使用动画,避免对文字大小做动画,尽量不要使用无窗口(windowless)模式等。(Silverlight 帮助文档 性能 章节有提到)

© 青梅猪马 | Powered by LOFTER