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;
 };
}

时间: 2025-01-01 15:37:55

Flash 计时器几种实现方法的相关文章

Flash制作雪花视觉动画效果的三种制作方法

Flash制作雪花视觉动画效果的三种制作方法 第一种方法: 最笨但也效果最好,就是用"引导线"功能,让雪花不停的飘呀飘,如果多用几个图层,效果更好.1.新建一个Flash影片.设背景为"黑色",其他的用默认值.2.按Ctrl+F8新建一个组件,类型为"影片剪辑",命名为"雪花".在它的正中用"铅笔"工具画一个不规则的多边形,然后用"颜料桶工具"将它填上白色.(如图1-1所示) 3.再用C

提示“您还没有安装flash播放器 请点击这里安装”两种解决方法

最新版Windows 8系统,为了方便用户对Flash内容的浏览,无论是桌面版还是Metro风格版IE10都内置了Flash插件.不过当我们用IE10浏览器在线观看视频的时候,却提示IE10没有安装flash播放器,同时其他网站上的Flash内容也无法打开,而IE10明明却是默认已安装了Flash插件. 此时,如果点击下载安装flash,会收到如下报错,原因是WIN 8下的flash是内置的和通过系统更新来更新的,不支持手动安装和更新flash. 下面提供两种解决方法: 方法一: 1. 出现这个

Android时分秒计时器的两种实现方法_Android

可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲述一下了. <Chronometer android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="%s" android:id

Android时分秒计时器的两种实现方法

可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲述一下了. <Chronometer android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="%s" android:id

flash与后台数据交换方法整理续

后台|数据 相关文章:flash与后台数据交换方法整理      个人觉得WebService的数据访问速度,仅次于Remoting,但WebService是一种通用型的接口,一般服务端技术都支持的!      WebService的优点:       1.WebService的接口支持比较广泛(Java,ASP.Net,PHP,Coldfusion-我下面举例用):       2.WebService是一个通用型的接口,所以服务端写的接口,不局限于Flash使用,其他程序也可以调用,"一举两

flash与后台数据交换方法整理

后台|数据 P.S   最近有一些网友总是询问flash与后台数据交互的问题,因此我就做了一些总结和整理,也想方便大家了!   目前据我所知,Flash与后台数据交互共有下列几种方法(如果你觉得不全,你可告知一下,我会添加上去了):    1.LoadVars(XML)    2.Flash Remoting    3.Webservice    4.XMLSocket  一.LoadVars篇  我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数

让字体在FLASH中保持清晰的方法

 都知道 当Flash显示静态文本的时候,文字就显得很模糊,中间甚至粘成一块,解决的办法有3个. 1) 使用设备字体 当你在flash中使用静态文本的时候,Flash会插入字体轮廓信息,并进行抗锯齿处理,所以轮廓会显得很模糊,使用设备字体后,Flash不再插入字体轮廓信息,只是在客户端播放时调用客户端的字体信息,也不会进行抗锯齿处理,这样的做结果有: a. 字体在12pt以下时很清晰,但在比较大(大约18pt以上)时有明显的锯齿. b. 如果客户端不存在相应的字体,则显示会出现预料外的情况,肯定

基于Android中实现定时器的3种解决方法_Android

在Android开发中,定时器一般有以下3种实现方法:一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方法下面逐一介绍:一.采用Handle与线程的sleep(long)方法Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释.1. 定义一个Handler类,用

Android中定时器的3种实现方法

在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与线程的sleep(long)方法 二.采用Handler的postDelayed(Runnable, long)方法 三.采用Handler与timer及TimerTask结合的方法 下面逐一介绍: 一.采用Handle与线程的sleep(long)方法 Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释. 1. 定义一个Han