当前位置:软件学习 > Flash >>

Flash 计时器几种实现方法

由于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在不同浏览器计时不准确的问题。

以上都是常用的计时方法,只能根据需要取舍,如果大家有更好更精确的计时方法也欢迎提出,需要提示一点的是:Timer用的越多效率越低,误差也越大,不知道FP10.2对于这些问题有没有实质性的改进

例子

 代码如下 复制代码

//新建fla文档(as2.0),复制以下代码到第一帧,ctrl+enter 即可看到效果
var timeText:TextField = this.createTextField("time", 0, 0, 0, 100, 20);
function init() {
 hitTime = 0;
 beginRunTime = 0;
 totalRunTime = 0;
 timeText.text = "00:00:00";
}
init();
onMouseDown = function () {
 switch (hitTime) {
 case 0 :
  //开始计时
  hitTime++;
  recordRunTime();
  run();
  break;
 case 1 :
  //暂停计时
  hitTime++;
  delete onEnterFrame;
  break;
 case 2 :
  //恢复计时
  hitTime++;
  recordRunTime();
  run();
  break;
 case 3 :
  //停止计时
  init();
  delete onEnterFrame;
  break;
 }
};
function recordRunTime() {
 beginRunTime = getTimer();
}
function run() {
 onEnterFrame = function () {
  trace(hitTime);
  if (hitTime == 1) {
   var totalHm = totalRunTime=getTimer()-beginRunTime;
  } else if (hitTime == 3) {
   var totalHm = getTimer()+totalRunTime-beginRunTime;
  }
  var totalM = int(totalHm/1000);
  var hm = totalHm%1000;
  var m = totalM%60;
  var f = int(totalM/60);
  timeText.text = f+":"+m+":"+hm;
 };
}

补充:flash教程,动画技术 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,