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

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

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

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内部机制(第二部分) -执行模型之可变跑道(扩展)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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的准确性问题:

留言

2011-05-16
次访问