AS3程序动画中Timer和Event.ENTER_FRAME之间的区别与选
Event.ENTER_FRAME事件做动画的原理
每当Flash运行器执行一次预定屏幕更新检查的时候它调度Event.ENTER_FRAME事件。注册以接收Event.ENTER_FRAME通知的任何函数都被反复执行,在由当前Flash运行器帧速率决定的一个频率下。由任何Event.ENTER_FRAME事件监听器做出的可见变化在它退出之前被描绘,这就是Event.ENTER_FRAME做动画的原理。
Event.ENTER_FRAME事件做动画的缺陷
1,每当想要改变指定的帧速率的时候,我们必须更新基于该帧速率计算速度的所有代码(除非使用基于速度的动画)
2,Flash运行器不总是能到达指定的帧速率,动画变慢。这种变慢甚至因系统负载而不同,帧速率可能只在短时期下降后恢复到它的正常速率。
在一般情况中,用稍有差别的速度播放一个动画是可以接受的,但是,当要求精确控制或者可见精度是有影响的时候,我们必须考虑帧速率的缺陷。此时,我们用基于逝去的时间而不是关联于指定帧来计算移动一个移动的距离更合适(即基于速度的动画)
用Timer做动画的原理
Timer类是一个一般的实用程序类,用于在一个特定的时间间隔后执行代码。每个Timer对象在一个程序员指定的频率下调度TimerEvent.TIMER事件。想要在该频率下执行的函数用Timer对象为TimerEvent.TIMER事件来注册。
帧速率对Timer的影响
尽管Timer类看似提供了一个完全随意的方式来在一个指定时期之后执行一个函数,但可能令人惊奇的是,它任然依赖于Flash运行器的帧速率。对于每次预定屏幕更新检查一个TimerEvent.TIMER事件最多可以产生10次(10倍于帧速率)。例如,给定每秒1帧的一个帧速率,一个TimerEvent.TIMER事件最多(快)只能每100毫秒执行一次,甚至在一个更小的delay值指定给一个Timer对象的时候。在每秒10帧的时候,一个TimerEvent.TIMER事件每秒最多可以发生100次(10毫秒每次)。在每秒100帧的时候,一个TimerEvent.TIMER事件最多每秒可发生1000次(1毫秒每次)。
当一个TimerEvent.TIMER事件设置为运行得比帧速率更不频繁的时候,它将执行于下一次预定屏幕更新的时间间隔之后。为了请求更新于下次预定更新前,使用TimerEvent类的实例方法updateAfterEvent()。
在Timer和Event.ENTER_FRAME之间选择
帧速率受变化的控制:当一个.swf文件被另一个运用程序装载的时候,该运用程序的帧速率可能和.swf文件指定的帧速率有很大的不同(被装在的帧速率被屏蔽,统一用运用程序的帧速率),从而导致.swf的动画播放太快或者太慢。被装载的.swf文件当然可以设置帧速率,但是改变帧速率可能导致在父亲应用程序的不需要的播放行为Timer类提供了一些帧速率的独立性。
使用大量的Timer对象需要更多的内存:在分散动画管理体系结构中,使用一个单独的Timer来控制每个对象动画需要的内存要多于通过类似的Event.ENTER_FRAME实现可能需要的。
使用大量的Timer对象会导致过度的更新请求:在分散动画管理体系结构中,使用一个单独的Timer和updateAfterEvent()相关联来控制每个对象的动画导致了对屏幕的多个独立的请求,有可能导致性能的问题。
基于这些因素,这里是一个推荐的最佳操作:
1,在必须使程序内容的显示同步于手工创建于Flash authoring tool(Flash CS3,Flash CS4等)的基于帧内容的显示的应用程序中,使用Event.ENTER_FRAME
2,在Flash运行器中的帧速率的变动必须被减轻的应用程序中,使用单个的Timer对象来编制所有动画,并使用基于速度的动画
3,当在Flash运行器中的帧速率的变动当做是可以接受的时候,使用Event.ENTER_FRAME(因为使用基于Event.ENTER_FRAME的动画代码一般要比基于Timer的等价物更简单和使用较少的内存)
4,避免使用单个的Timer对象来移动单个的显示对象。只要有可能,使用一个单个的Timer对象来编制所有的动画。另外提示一下,如果你想在不同时间更新不同的对象,单独的Timer对象可能更合适