2012-03-10 20 views
2

更新メソッドにENTER_FRAMEメソッドとTIMERメソッドを使用しているときに、それらを比較する方法を探しています。私はいくつかの答えのためにインターネットの周りを見ているが、私はまだ理解することが難しいと思っている。Actionscript 3.0:更新メソッドのENTER_FRAMEイベントとTIMERイベントの使用の違いは何ですか?

誰でも簡単に異なるものを手に入れることができますか?

答えて

0

ENTER_FRAMEは映画のフレームレートに相対的です。 TIMERイベントは絶対的なものでなければなりません。

+0

申し訳ありませんが、少し詳しく説明することができるだろうか?私は理解していますが、TIMERのイベントは絶対的なものでなければなりませんか? – user1256106

5

タイマーイベントは、swfのフレームレートから独立して(ポイントまで)ディスパッチできます。 ENTER_FRAMEイベントより頻繁に、またはより頻繁に発生することがあります。また、ENTER_FRAMEでカバーされている時間間隔の間に計算の精度が気になる場合に使用する必要があります。これの最も一般的な使用例は物理エンジンです。できるだけ正確なものにするため、Flashのfpsより速い速度でシミュレーションを実行したいと考えています。

また、所定の遅延後に特定のアクションを発生させる場合は、タイマーを使用すると便利です。たとえば、タイマーを使用すると、10秒後に簡単にアクションを実行できます。タイマーのコンストラクタに10000ミリ秒を渡すだけで、10秒後にTimerイベントが送出されます。 ENTER_FRAMEを使用する場合は、10秒が経過したことを知りたい場合は、フレーム更新ごとに経過時間を手動で追跡する必要があります。

ENTER_FRAMEイベントは、タイムラインのレンダリングサイクルに関連付けられ、指定したフレームレートと多かれ少なかれ一致します。たとえば、フレームレートが30fpsの場合、1秒あたり約30のENTER_FRAMEイベントが表示されます。特に複雑な表示リストがある場合、またはロジックの実行に特に時間がかかる場合は、表示される表示が少なくなることがあります。

+0

非常にありがとう、私は今理解している – user1256106

1

ENTER_FRAMEは、仮想マシンのレンダリングループが実行されるたびにトリガされるイベントで、ムービーのフレームレートに相対的です。たとえば、Flash CS IDEで、フレームレートを30に設定した場合、ルート表示オブジェクトまたはステージから30のENTER_FRAMEイベントが1秒ごとに発生します。

一方、タイマーはタイマーです。これは、システムクロック時間に基づいてのみ実行されます。たとえば、タイマーを1ミリ秒の遅延で設定すると、そのタイマーは起動後1ミリ秒後に起動し、有効にした場合は1ミリ秒ごとに1回起動します。私がcamusが答えようとしていることは、このプロセスがフレームレートとは独立しているということです。これは、システムクロックのチェックと、要求された遅延が満たされたタイマーのイベントのトリガにのみ基づいています。これは、タイマーが開始されたシステム時刻を保存し、タイマーが遅れて保存された時間以上になるまで、現在のシステム時刻を繰り返し確認することによって、内部的に検証されます。例:上記の「コード」は、単に擬似

timer.start() //Lets say current system time is 1000 

タイマー期間は1000年であるので、我々は、システム時刻が2000年

checkTimers() //Loops, gets the current system 

//If system time is greater than or equal to 2000, trigger timer with an event 
dispatchEvent(Timer.TIME, etc, etc); 

注意以上である場合に、このタイマーをトリガーする必要があることシステムの基本原則を示すコード。

+1

ありがとう、それは非常に有用で理解しやすいでした! – user1256106

+0

私はあなたがサイトにはかなり新しい、歓迎し、ちょうどヒントを参照してください... upvote私の男!忘れないでください便利な答えをupvoteすることを忘れないでくださいここでカップルtheresとあなたが最高を見つける答えを見つけるなら、それを正しい答えとしてマークするために、その隣にあるチェックマークをクリックすることを忘れないでください。お役に立てて嬉しいです。 :) –

2

"enterFrame"がすべてのフレームでディスパッチされます。

SWFが24fpsであると仮定します:"enterFrame"が毎秒24回まで送出されます。

"timer"が設定された間隔で送出されます。

遅延時間が50ミリ秒のTimerを開始するとします。"timer"が毎秒20回までディスパッチされます。

これらのイベントの実際の頻度は、ホスト環境とアプリケーション内部で何が起こっているかによって異なります。たとえば、ハンドラ内にループがforループの場合、1,000要素の配列を繰り返し処理し、各要素に対して文字列操作を実行すると、配列に10要素しか含まれていない場合よりも"timer"イベントが少なくなる可能性があります。同様に、ユーザーのシステムの空きメモリが不足している場合、Flash PlayerでSWFを実行する際に問題が発生し、これらのイベントが送出される速度が遅くなる可能性があります。

"enterFrame"は、フレームレートに直接依存します。 "timer"は、フレームレートにある程度間接的に依存します。 12fpsで

package 
{ 

import flash.display.*; 
import flash.events.*; 
import flash.utils.*; 

public class Test extends Sprite 
{ 
    private var timer:Timer = null; 
    private var timerEventCount:int = 0; 
    private var enterFrameEventCount:int = 0; 
    private var startTime:Number = 0; 

    public function Test() 
    { 
     timer = new Timer(20, 0); 
     timer.addEventListener("timer", timerHandler); 
     timer.start(); 

     addEventListener("enterFrame", enterFrameHandler); 

     startTime = new Date().time; 
    } 

    private function timerHandler(event:Event):void 
    { 
     timerEventCount++; 

     var timeElapsed:Number = new Date().time - startTime; 

     //for (var i:int = 0; i < 4000; i++) 
     // trace("i", i); 

     if (timeElapsed >= 1000) { 
      // Stop timer after 1 second. 
      timer.stop(); 

      removeEventListener("enterFrame", enterFrameHandler); 

      trace(timerEventCount + " timer events and " 
        + enterFrameEventCount + " enterFrame events in " 
        + timeElapsed + " milliseconds."); 
     } 
    } 

    private function enterFrameHandler(event:Event):void 
    { 
     enterFrameEventCount++; 
    } 
} 

} 

コンパイル:

あなた(または他の誰かが)常に私が何を意味するか聞いてきますので、「やや間接的に、」ここでは両方のイベントをテストする小さなAS3アプリです

mxmlc Test.as -default-frame-rate=12 

出力:60fpsので

45 timer events and 12 enterFrame events in 1001 milliseconds. 

コンパイル:

mxmlc Test.as -default-frame-rate=60 

出力:

29 timer events and 58 enterFrame events in 1010 milliseconds. 

あなたが見ることができるように、高いフレームレートが実際にタイマーを遅くします。私はこれをFlash Player Debugger 10.3.181.34(10.3)で実行しています。あなたのマイレージは異なる場合があります。

最後に、forループのコメントを外して60fpsでもう一度実行すると、私の話を見ることができます。

出力:

3 timer events and 3 enterFrame events in 1145 milliseconds. 
+1

+1は、アクションスクリプトの実行が1つのスレッドでしか実行されないという事実から生じる問題を指摘しています。 –

関連する問題