我知道不建议定时器的延迟小于20,但我有两个定时器:一个延迟一毫秒,第二个定时器为5000(尽管没关系)。
我对第一个计时器使用TIMER_TICK
事件,因此我可以从第二个计时器currentCount
(5000)中减去delay
。但是,由于as3中的计时器与 frameRate
相关联,并且不推荐不到20毫秒的延迟,因此计时器的速度会慢很多。
问题:
有没有办法以某种方式“解开”与 frameRate
的关系?
我已完成研究以帮助回答此问题,并且 getTimer()
似乎在我trace
时提供了有效整数。所以我可以用它做点什么。
答案 0 :(得分:2)
令人遗憾的是,开发人员并没有真正从帧速率“解开”Timer或类似的类。
使用delay=1
的计时器是完全没用的,因为它不会经常触发。因此,以小于帧速率的间隔刷新某些内容并不能保证您获得有保证的结果。
但是,您可以看到自上次更新以来已经过了多少时间。假设您有一个仿真,其中Sprite以1px / ms的速度移动。试图快速移动Sprite会失败。即使计算得足够快,显示器也不会如此简单地刷新屏幕。
但是你可以知道代码执行的时间是多少,以毫秒为单位移动下一次更新的许多像素的Sprite:
var startTime:int = getTimer();
// YOUR CODE HERE
var timePassed:int = getTimer() - startTime; // returns the amount of time spent on code execution
请记住,自虚拟机启动以来,getTimer()开始计数。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getTimer()
这是一篇由Adobe Flash Player工程师撰写的博客文章,解释了为什么不可能以较小的时间间隔和一般的FP模型为目标:http://www.kaourantin.net/2006/05/frame-rates-in-flash-player.html
答案 1 :(得分:0)
您不会比每帧,一段时间更快地获得计时器事件。你确实可以通过getTimer()
计算经过的时间,使用捕获然后比较技术通过输入框架监听器,如下所示:
var oldTime:int;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event):void {
var frameTime:int=getTimer()-oldTime;
oldTime=getTimer();
// process frameTime
}
然而,请注意,这是一种在游戏中被讨厌的行为,也就是说,如果Flash播放器由于某种原因而滞后,每帧的getTimer()
差异将会激增,使您的游戏引擎表现得像个很多期望在没有来自玩家的任何动作的情况下通过,并且在这样的游戏中,期望玩家实时做出反应,因此游戏引擎可能会在单帧内对游戏进行反应。解决方法是将帧时间差设置为合理的值,该值对应于合适的帧速率,低于该值时,您不希望您的游戏在任何情况下运行(例如,10fps,1000/10 = 100)。
static const FRAME_CAP:int=100;
if (frameTime>FRAME_CAP) frameTime=FRAME_CAP;
PS:我希望定时器与帧速率挂钩的实际原因是现在正在内部调用定时器检查例程,同时创建输入帧或退出帧事件,然后通过整个显示列表传播,实际然后通过getTimer()
精确计算计时器的更新时间,然后将其与计时器的内部“下一次点火”字段进行比较,以触发相应的TIMER_TICK
事件,并使用getTimer()+delay
更新这些事件。
答案 2 :(得分:0)
我发现一个简单的解决方案是使用补间引擎并收听更改事件: