4

わかりましたので、タイマーベースの動きはFRのものよりも優れていると聞きました。V = V + n 1/60 秒あたりであり、フレーム @ 60 fps あたりではありません。彼らは、FRラグで速度が低下するのではなく、実際の速度になると述べました。しかし、私が試してみると、タイマーはまったく信頼できません。私は何か間違ったことをしていますか?原因 Timer(20,0) は、アニメーションが進行するにつれて遅くなります。つまり、クリップが過重になると、タイマー ベースまたは FR に関係なく速度が低下します。ええ、私は毎秒新しいシェイプを作成するテスト クリップを持っていたので、しばらくするとかなり多くのものがありましたが、タイマーは私の時計よりも遅くなり、秒が長くなります。しかし、タイマーは余分な作業であり、頭痛の種です。それは価値がないのでしょうか、それとも間違って使用しましたか?(他の機能よりも優先して作っていませんか?)

4

4 に答える 4

4

はい、SWF が 1 フレーム未満の長さでステージをレンダリングできる場合はどちらも問題ありません。そうでない場合は、何をしてもフレームレートが低下します。この大きな FPS が必要な場合は、SWF のパフォーマンスを調整する必要があります。また、タイマーはフレームごとに 1 回よりも早くイベントを発生させることはできません。(実際、通常の時間の流れと競合することができない十分に遅い PC で SWF が実行されるかどうかがわからないため、フレーム時間のアプローチが一般的に優れていると思います。)

あなたの場合、タイマーをドロップします。それらはフレームごとにもう 1 つのイベントをスローします。イベントが非同期であるため、ほとんど信頼性が低くなります。つまり、タイマー イベントが次のフレームの前に発生すると一貫して言うことはできません。ホスト PC のわずかな遅れが、多くのプレイヤーの楽しみを台無しにする可能性があります。(Pyro と古い PIII を覚えています。システム時間を使用してレベルのビート タイムを記録していましたが、ボールを発射すると速度を上げることができず、アニメーションが重くてフレーム レートが低下し、本質的に速くなることができませんでした。タイムスコア.) タイマーはすでにフレームごとに約 1 回イベントを発生させており、これ以上速くなることはありません。

于 2013-02-26T05:32:13.563 に答える
2

AS3のタイマーは確かに信頼できません。AS3のタイマーは、1000未満の値にすることはできません。これは、Adobeによって公式に文書化されています。1000msの制限でタイマーをテストすることもできます。これは、800〜999msの間隔でランダムに起動することに気付くでしょう。これは決して正確ではありません。

フレーム限定/無料のアプリケーションを作成したい場合は、「getTimer」をお勧めします。渡されたミリ秒の量を使用して、渡された正しい時間を計算してから、フレームをレンダリングできます。

このプロジェクトのClockクラスを見てください: Realtime Clock

于 2013-02-26T05:39:49.713 に答える
1

あなたは何も悪いことをしていません。理想的とは言えませんが、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;
}
于 2013-02-26T06:00:34.427 に答える
0

これが役立つかもしれません。

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;
    }
}
于 2013-10-30T12:03:07.560 に答える