ランタイムコードの実行の基礎

アプリケーションのパフォーマンスを改善する方法を理解するために重要な点の 1 つは、Flash Platform ランタイムでコードを実行する方法を理解することです。ランタイムは、各「フレーム」で発生する特定のアクションと共にループで実行されます。この場合のフレームとは、アプリケーションに指定されたフレームレートによって決まる、単なる時間のブロックです。各フレームに割り当てられる時間数は、フレームレートに直接関連します。例えば、30 フレーム/秒のフレームレートを指定すると、ランタイムは最後の 30 分の 1 秒で各フレームの作成を試行します。

アプリケーションの初期フレームレートはオーサリング時に指定します。フレームレートは、Adobe® Flash® Builder™ または Flash Professional の設定を使用して設定できます。また、コードで初期フレームレートを指定することもできます。ActionScript のみのアプリケーションでフレームレートを設定するには、 [SWF(frameRate="24")] メタデータタグをルートドキュメントクラスに適用します。MXML では、Application または WindowedApplication タグで frameRate 属性を設定します。

各フレームループは 2 フェーズで構成され、3 つのパートに分割されます。イベント、 enterFrame イベント、およびレンダリングです。

第 1 フェーズには 2 つのパート(イベントおよび enterFrame イベント)が含まれ、そのどちらもコードで呼び出される場合があります。第 1 フェーズの第 1 パートでは、ランタイムイベントが到着し、送出されます。これらのイベントで、ネットワークでのデータのロードからの応答など、非同期操作の完了または進行を表すことができます。これらのイベントには、ユーザー入力からのイベントも含まれます。イベントが送出されると、登録したリスナーのコードがランタイムで実行されます。イベントが発生しない場合、アクションは実行されず、ランタイムはこの実行フェーズが完了するまで待機しますアクティビティがないので、フレームレートは上がりません。実行サイクルの他の部分でイベントが発生すると、それらのイベントはキューに格納され、次のフレームで送出されます。

第 1 フェーズの第 2 パートは enterFrame イベントです。このイベントが他のイベントと異なる点は、フレームごとに 1 度必ず送出される点です。

すべてのイベントが送出されると、フレームループのレンダリングフェーズが開始されます。その時点で、画面上のすべての可視エレメントの状態が計算され、それらのエレメントが画面に描画されます。その後で、競技場を周回する走者のように、プロセスが繰り返されます。

注意: updateAfterEvent プロパティが含まれるイベントについては、レンダリングフェーズを待たずに直ちにレンダリングを行うよう強制できます。ただし、 updateAfterEvent によるパフォーマンス低下がひんぱんに発生する場合は、このプロパティを使用しないでください。

フレームループの 2 つのフェーズにかかる時間が同じになる場合を想定することは最も容易です。その場合、各フレームループの半分では、イベントハンドラーとアプリケーションコードが実行され、もう半分ではレンダリングが発生していると考えられます。ただし、多くの場合、実際にはこのような状況になっていません。フレームで使用できる時間のうち半分を超える時間がアプリケーションコードで使用されて、時間割り当てが増え、レンダリングに使用できる時間割り当てが減る場合があります。また、特にフィルターやブレンドモードなどの複雑な可視コンテンツでは、レンダリングがフレーム時間の半分よりも長くかかる場合もあります。フェーズにかかる実際の時間は柔軟なので、フレームループは一般的に「弾性レーストラック」と呼ばれます。

フレームループの組み合わせた操作(コードの実行とレンダリング)に時間が長くかかり過ぎる場合、ランタイムはフレームレートを維持できません。フレームは拡張され、割り当てられた時間よりも長くかかるので、次のフレームがトリガーされるまで遅延が発生します。例えば、フレームループにかかる時間が 1/30 秒を上回る場合、30 フレーム/秒で画面を更新することはできません。フレームレートが低速になると、操作性が低下します。アニメーションが途切れ途切れになることや、状況によってはアプリケーションがフリーズし、ウィンドウが空になることがあります。

Flash Platform ランタイムコードの実行およびレンダリングモデルについて詳しくは、次のリソースを参照してください。