在AS3开发中,计时器应该是最常见的组件了,关于各种计时方法也是层出不穷,一般来说,各种方法都会满足我们的需要,但是我们还是会遇到一个让人头痛的问题,那就是精度。

由于Flash是解释运行,限于FP的虚拟机有诸多限制,所以不要指望能和C++那样拥有可以到达毫秒级的高精度计时,甚至连微秒级别的计时也不容乐观,我们今天就来探讨一下常用的计时方法和他们的差别。

1 Event.ENTERFRAME事件

        这个应该是最常见的了,几乎很多计时都用这个事件。它表示帧频,也就是说,每秒钟播放多少个帧,最新的CS5版本默认是24帧,早期的版本默认是12帧,这个是由于为了弥补和提高早期动画不流畅的问题而提高了帧率,事实也证明,人眼对于每秒30帧以上的画面切换就不会再感到闪烁,对于Flash,24帧就足够了

        Event.ENTERFRAME事件虽然好用,但是在FP10.1版本以后,Adobe为了解决Flash内存占用的问题,做了一个优化:那就是如果当前的Flash,包括FP中本地和WEB页面上的动画,没有处于焦点状态,也就是说有其他窗口遮盖了Flash,那么它会自动降频,降为2帧/秒来运行,这样的话计时就大大不准了,这种方法不太实用时间类的计时。

2 Timer

        Timer真是让人既爱又恨,不可否认的是,Timer的确是一个非常方便的计时器组件,但是他的精度实在是太低了,1个小时中间我见过的误差能有几分钟,我们也可以测试一下Timer的精度:

var TestTime:Timer = new Timer(1000); 
TestTime.addEventListener(TimerEvent.TIMER,OnTimer); 
TestTime.start(); 
  
private function OnTimer(e:TimerEvent){       
var tick = getTimer();      
trace(tick); 
}

getTimer()是获得Flash运行到现在的毫秒数,运行上面的代码我们会发现,每次trace的结果都忽大忽小,按道理说应该是按照一定的固定数字增加才对,但是这个数字并不固定,虽然trace会占用一部分时间,但是总的来说,Timer的精度还是不容乐观。

3 setInterval()方法

        这个是按照指定的毫秒数去不断运行一个方法,但是和Timer差不多,而且setInterval()本身的机制需要Flash不断的去调用,因此也不是很理想。

4 getTimer()方法

        有人说用getTimer()来计时,理由是它获得的是系统所经过的毫秒数,不错,但是你怎么来调用这个方法呢?还是要在Timer或者ENTERFRAME里调用,俗话说上梁不正下梁歪,就算getTimer再精确,由于调用它的方法不精确,所以也没有多大意思

5 Tween

        Tween也可以计时,这个一般人好像并不会用到,但是用Tween来做计时有个明显的好处就是,他不会受WEB页面的影响,因为有不少人反映在WEB里播放Flash有的机器快有的慢,如果用Tween来计时就没有这个问题,具体原因我也说不清,但是我的确用这个方法解决了曾经一个Flash在不同浏览器计时不准确的问题。

 

转自http://www.zystudios.cn/blog/post/50.Shtml


 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐