一直让我困惑的事情,至今仍然存在,为什么AS3中的Timer类不能更快地更新到更低的毫秒数?
我似乎记得读过Flash能够每20毫秒最多推送一次更新到计时器(推荐) - 我为最近一次游戏创建的计时器每50毫秒更新一次,但即便如此。在本地,它工作正常,在在线环境中,它没有。
这里有什么特别的错误,或者Flash是否真的无法在在线环境中快速更新以获得一秒钟的两位小数?
同样,这在本地工作正常。
我的计时器代码在这里:
package src.gameShared {
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import src.main;
public class timer extends Sprite {
private var _updateAmount:int = 50; // MUST give a whole number if divided by 1000 and less than 100. Recommended above 20. Gives 25, 40 or 50.
private var _timer:Timer = new Timer(_updateAmount,0);
private var _count:int = new int();
public function startTimer():void{
_timer.addEventListener(TimerEvent.TIMER, updateText, false, 0, true);
_timer.start();
}
public function stopTimer():void{
_timer.stop();
// Add to score
}
private function updateText(e:TimerEvent):void{
_count++
dtf_txt.text = returnTime();
}
// The below will display double minutes, double seconds and double milliseconds. Most math is based around the double milliseconds.
public function returnTime(_score:Boolean = false){
/*
** Minutes takes _count and divides it by (1000/50) = 20 (_updateAmount being 50), to give the value of 1 per second. If _count is 20, this has run 20 times and thus 1000 miliseconds have passed
** So the int can be set to 1. Minutes then checks to see if there is 60 of them (60 seconds).
** Seconds does the same, except it "caps" at 60 before resetting
*/
var _division:int = (1000/_updateAmount)
var minutes:int = Math.floor(_count /_division / 60);
// Second is 1000 miliseconds
var seconds:int = Math.floor(_count /_division) % 60;
var milseconds:int = new int();
/* After how many ticks is it a second. So at 50, 20 ticks would be 100 so 1 second, but _count would only show 20. So we *5 to get 100.
** 100 = max num we want, divided by (1000 (1sec) divided by _updateAmount)
** 100/(1000/50) = 5. 5*20 (number of ticks at 50milli per sec) = 100 = what we want
*/
var _getMil:Number = 100/(1000/_updateAmount) // 5 (20 lots of _updateAmount per second, we want an update on every tick. We do *5 as 20 updates fits into 100 that way)
// How many updates to fit into 1000 (1 sec), then divide it by 10 as we want a single digit result
var _getSmallMil:Number = (1000/_updateAmount)/10 // 2 (20 lots of _updateAmount per second, we only want an update every 2nd for the whole number, so we half _count)
_score == false ? milseconds = Math.floor(_count*_getMil) % 100 : milseconds = Math.floor(_count/_getSmallMil) % 10;
// Easier to read code that does the same thing but isn't dynamic:
// _score == false ? milseconds = Math.floor(_count*5) % 100 : milseconds = Math.floor(_count/2) % 10;
var secString:String = (seconds < 10) ? ("0" + String(seconds)) : String(seconds);
var minString:String = (minutes < 10) ? ("0" + String(minutes)) : String(minutes);
if(_score){
var milString:String = String(milseconds);
if(minutes >= 1){
var _holder:int = int(secString);
_holder = _holder + (minutes*60);
secString = String(_holder);
}
return secString+"."+milString;
}
else{
var milString:String = (milseconds < 10) ? ("0" + String(milseconds)) : String(milseconds);
return minString+":"+secString+":"+milString;
}
}
}
}
答案 0 :(得分:7)
定时器是非动画内容的最佳选择;但是,作为一个可视化运行时,计算超出帧速率是合乎逻辑的。
每秒定位60帧是一个现实的上限。
Flash弹性跑道上有很多文章。
参考
答案 1 :(得分:1)
尝试提高帧率。 AS执行仍然与帧相关联,因此如果帧速率对于定时器间隔而言太低,则会遇到粒度问题。
答案 2 :(得分:0)
此外,您没有在timerEvent ...
中通过updateAfterEvent更新图形private function updateText(e:TimerEvent):void{
_count++
dtf_txt.text = returnTime();
e.updateAfterEvent();
}
// e.updateAfterEvent();