わかりましたので、タイマーベースの動きはFRのものよりも優れていると聞きました。V = V + n 1/60 秒あたりであり、フレーム @ 60 fps あたりではありません。彼らは、FRラグで速度が低下するのではなく、実際の速度になると述べました。しかし、私が試してみると、タイマーはまったく信頼できません。私は何か間違ったことをしていますか?原因 Timer(20,0) は、アニメーションが進行するにつれて遅くなります。つまり、クリップが過重になると、タイマー ベースまたは FR に関係なく速度が低下します。ええ、私は毎秒新しいシェイプを作成するテスト クリップを持っていたので、しばらくするとかなり多くのものがありましたが、タイマーは私の時計よりも遅くなり、秒が長くなります。しかし、タイマーは余分な作業であり、頭痛の種です。それは価値がないのでしょうか、それとも間違って使用しましたか?(他の機能よりも優先して作っていませんか?)
4 に答える
はい、SWF が 1 フレーム未満の長さでステージをレンダリングできる場合はどちらも問題ありません。そうでない場合は、何をしてもフレームレートが低下します。この大きな FPS が必要な場合は、SWF のパフォーマンスを調整する必要があります。また、タイマーはフレームごとに 1 回よりも早くイベントを発生させることはできません。(実際、通常の時間の流れと競合することができない十分に遅い PC で SWF が実行されるかどうかがわからないため、フレーム時間のアプローチが一般的に優れていると思います。)
あなたの場合、タイマーをドロップします。それらはフレームごとにもう 1 つのイベントをスローします。イベントが非同期であるため、ほとんど信頼性が低くなります。つまり、タイマー イベントが次のフレームの前に発生すると一貫して言うことはできません。ホスト PC のわずかな遅れが、多くのプレイヤーの楽しみを台無しにする可能性があります。(Pyro と古い PIII を覚えています。システム時間を使用してレベルのビート タイムを記録していましたが、ボールを発射すると速度を上げることができず、アニメーションが重くてフレーム レートが低下し、本質的に速くなることができませんでした。タイムスコア.) タイマーはすでにフレームごとに約 1 回イベントを発生させており、これ以上速くなることはありません。
AS3のタイマーは確かに信頼できません。AS3のタイマーは、1000未満の値にすることはできません。これは、Adobeによって公式に文書化されています。1000msの制限でタイマーをテストすることもできます。これは、800〜999msの間隔でランダムに起動することに気付くでしょう。これは決して正確ではありません。
フレーム限定/無料のアプリケーションを作成したい場合は、「getTimer」をお勧めします。渡されたミリ秒の量を使用して、渡された正しい時間を計算してから、フレームをレンダリングできます。
このプロジェクトのClockクラスを見てください: Realtime Clock
あなたは何も悪いことをしていません。理想的とは言えませんが、Flash は更新を最大フレーム レートに制限しているため、Timer
イベントが正確ではありません。個人的には、 を使用して現在のシステム時間をチェックするフレームベースのループを使用して、時間に敏感なものを作成する傾向があるため、次のnew Date().getTime()
ようなものを使用します。
private var lastFrameTime:Number = new Date().getTime();
private var now:Number;
addEventListener(Event.ENTER_FRAME, frameTick);
private function frameTick(e:Event):void {
now = new Date().getTime();
V = V + n * (now - lastFrameTime) * 0.001;
lastFrameTime = now;
}
これが役立つかもしれません。
public class Timer extends EventDispatcher
{
private var instance:int;
private var _interval:Number;
private var _updateInterval:uint;
private var _lastCount:int
private var _repeatCount:int;
private var _count:int;
private var _started:Boolean;
public function Timer(interval:Number,repeatCount:int=0)
{
_interval=interval;
_repeatCount=repeatCount;
}
private function checkTime():void
{
var curCount:int=int(currentTime()/_interval);
if(curCount<=_lastCount)return;
_lastCount=curCount
_count++;
dispatchEvent(new TimerEvent(TimerEvent.TIMER));
if(_count==_repeatCount&&_repeatCount>0)
{
stop();
dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE));
_count=0;
}
}
public function start():void
{
if(_started)return;
_started=true;
instance = getTimer();
_updateInterval=setInterval(checkTime,10);
_lastCount=int(currentTime()/_interval);
}
public function stop():void
{
_started=false;
clearInterval(_updateInterval);
}
public function reset():void
{
_count=0;
stop();
start();
}
private function currentTime():Number
{
if (instance == 0)
{
instance = getTimer();
}
return (getTimer() - instance);
}
public function get currentCount():int
{
return _count;
}
}