Timer是依赖于帧率的?

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:Timer是依赖于帧率的?
  • 本文链接:http://zengrong.net/post/1322.htm

我知道,Timer是不准确的。但是,我从来没有想过,Timer是依赖于frameRate的。

看下面的代码,你认为 _delay 的值是多少?我想,如果不是500,也应该是501,498之类的……

但是,结果却是 500,1000,500,1000 的顺序间隔。不信就试试看 😉

2011-05-16 17:06更新:貌似,将帧率设置成30也不准!我的FP是10.2.152.32,难道是传说中的BUG?

2011-05-16 18:10更新:看了跑道模型和FP的渲染模式,但也无法解释这种现象:

如果是说Timer受到跑道模型的影响,为何enterFrame是准确的?

按跑道模型,EnterFrame事件应该在跑道模型第1步的时候执行,而Timer也是在这个时候进行计算的。如果enterFrame准确,那么timer也应该准确,起码不应该相差太多才是。

可是500ms的差别,太大了。

关于跑道模型的文章:

Flash Player 10.1内部机制(第二部分) -执行模型之可变跑道

Flash Player 10.1内部机制(第二部分) -执行模型之可变跑道(扩展)

package
{
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.utils.getTimer;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.BitmapData;
import flash.events.Event;

/**
 * 测试在CPU高负载的时候Timer与EnterFrame的间隔
 */
[SWF(frameRate=2)]
public class RunTest extends Sprite
{

    public function RunTest()
    {
        _timer = new Timer(500);
        _timer.addEventListener(TimerEvent.TIMER, handler_timer);
        _timer.start();
        this.stage.addEventListener(MouseEvent.CLICK, handler_click);
        //this.stage.addEventListener(Event.ENTER_FRAME, handler_enterFrame);
    }

    private var _timer:Timer;
    private var _elapse:int = 0;
    private var _delay:int = 0;

    public function updateTime():void
    {
        var __thisTime:int = getTimer();
        _delay = __thisTime - _elapse;
        trace('_elapse:', _elapse, ',_delay:', _delay, ',getTimer:', getTimer());
        _elapse = __thisTime;
    }

    public function handler_timer($evt:TimerEvent):void
    {
        updateTime();
    }

    public function handler_enterFrame($evt:Event):void
    {
        updateTime();
    }

    public function handler_click($evt:MouseEvent):void
    {
        trace('draw');
        for(var i:int=0;i<1000; i++)
        {
            var __aaa:BitmapData = new BitmapData(550, 400);
            __aaa.draw(this);
        }
    }
}
}

找到几篇类似中文文章介绍Timer的准确性问题: