
オブジェクトプロパティのフリーズとフリーズ解除には、
REMOVED_FROM_STAGE イベントおよび
ADDED_TO_STAGE イベントを使用します。
コードを最適化するには、オブジェクトのフリーズとフリーズ解除を常に実行します。フリーズとフリーズ解除はすべてのオブジェクトにとって重要ですが、特に表示オブジェクトにとって重要です。表示オブジェクトは、既に表示リストになく、ガベージコレクションで収集されるのを待機している状態でも、CPU 負荷の高いコードを使用している可能性があります。例えば、Event.ENTER_FRAME を引き続き使用している場合などです。その結果、Event.REMOVED_FROM_STAGE イベントおよび Event.ADDED_TO_STAGE イベントを使用してオブジェクトを正しくフリーズおよびフリーズ解除することが重要です。次の例は、キーボードの操作によってステージ上で再生されるムービークリップを示しています。
// Listen to keyboard events
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp);
// Create object to store key states
var keys:Dictionary = new Dictionary(true);
function keyIsDown(e:KeyboardEvent):void
{
// Remember that the key was pressed
keys[e.keyCode] = true;
if (e.keyCode==Keyboard.LEFT || e.keyCode==Keyboard.RIGHT)
{
runningBoy.play();
}
}
function keyIsUp(e:KeyboardEvent):void
{
// Remember that the key was released
keys[e.keyCode] = false;
for each (var value:Boolean in keys)
if ( value ) return;
runningBoy.stop();
}
runningBoy.addEventListener(Event.ENTER_FRAME, handleMovement);
runningBoy.stop();
var currentState:Number = runningBoy.scaleX;
var speed:Number = 15;
function handleMovement(e:Event):void
{
if (keys[Keyboard.RIGHT])
{
e.currentTarget.x += speed;
e.currentTarget.scaleX = currentState;
} else if (keys[Keyboard.LEFT])
{
e.currentTarget.x -= speed;
e.currentTarget.scaleX = -currentState;
}
}
「Remove」ボタンをクリックすると、表示リストからムービークリップが削除されます。
// Show or remove running boy
showBtn.addEventListener (MouseEvent.CLICK,showIt);
removeBtn.addEventListener (MouseEvent.CLICK,removeIt);
function showIt (e:MouseEvent):void
{
addChild (runningBoy);
}
function removeIt(e:MouseEvent):void
{
if (contains(runningBoy)) removeChild(runningBoy);
}
ムービークリップは、表示リストから削除された状態でも、引き続き Event.ENTER_FRAME イベントを送出します。ムービークリップはまだ実行されていますが、レンダリングは行われません。この状況を正しく処理するには、適切なイベントを監視し、イベントリスナーを削除して、CPU を集中的に使用するコードが実行されないようにします。
// Listen to Event.ADDED_TO_STAGE and Event.REMOVED_FROM_STAGE
runningBoy.addEventListener(Event.ADDED_TO_STAGE,activate);
runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate);
function activate(e:Event):void
{
// Restart everything
e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement);
}
function deactivate(e:Event):void
{
// Freeze the running boy - consumes fewer CPU resources when not shown
e.currentTarget.removeEventListener(Event.ENTER_FRAME,handleMovement);
e.currentTarget.stop();
}
「Show」ボタンをクリックすると、ムービークリップが再び開始され、再度 Event.ENTER_FRAME イベントが監視されて、キーボードは正しくムービークリップを制御します。
注意: 表示リストから表示オブジェクトを削除する場合、削除後にその参照先を null に設定しても、オブジェクトがフリーズされるとは限りません。ガベージコレクションを実行しないと、オブジェクトが表示されていない場合でも、そのオブジェクトはメモリおよび CPU を消費し続けます。オブジェクトの CPU 消費量を最小限に抑えるには、オブジェクトを表示リストから削除するときに、オブジェクトが完全にフリーズされていることを確認してください。
また、Flash Player 10 および AIR 1.5 以降では、次のように動作します。再生ヘッドが空のフレームを検出すると、フリーズ機能が実装されていない場合でも、表示オブジェクトが自動的にフリーズされます。
フリーズの概念は、Loader クラスでリモートコンテンツを読み込む場合にも重要です。Flash Player 9 および AIR 1.0 で Loader クラスを使用している場合は、コンテンツを手動でフリーズする必要があります。これを行うには、LoaderInfo オブジェクトが送出する Event.UNLOAD イベントを監視します。すべてのオブジェクトを手動でフリーズするのは面倒な作業です。Flash Player 10 および AIR 1.5 では、Loader クラスに unloadAndStop() と呼ばれる新しい重要なメソッドが導入されています。このメソッドを使用すると、SWF ファイルをアンロードし、ロード済みの SWF ファイルに含まれているすべてのオブジェクトを自動的にフリーズして、ガベージコレクターを強制的に実行できます。
次のコードは、SWF ファイルをロードした後で unload() メソッドを使用してアンロードします。この処理はリソースを消費し、手動によるフリーズが必要になります。
var loader:Loader = new Loader();
loader.load ( new URLRequest ( "content.swf" ) );
addChild ( loader );
stage.addEventListener ( MouseEvent.CLICK, unloadSWF );
function unloadSWF ( e:MouseEvent ):void
{
// Unload the SWF file with no automatic object deactivation
// All deactivation must be processed manually
loader.unload();
}
ベストプラクティスは、unloadAndStop() メソッドを使用して、フリーズをネイティブに処理し、ガベージコレクション処理を強制的に実行することです。
var loader:Loader = new Loader();
loader.load ( new URLRequest ( "content.swf" ) );
addChild ( loader );
stage.addEventListener ( MouseEvent.CLICK, unloadSWF );
function unloadSWF ( e:MouseEvent ):void
{
// Unload the SWF file with automatic object deactivation
// All deactivation is handled automatically
loader.unloadAndStop();
}
unloadAndStop() メソッドが呼び出されたときに発生するアクションを以下に示します。
サウンドが停止します。
SWF ファイルのメインタイムラインに登録されたリスナーが削除されます。
Timer オブジェクトが停止します。
ハードウェア周辺機器(カメラやマイクなど)が解放されます。
すべてのムービークリップが停止します。
Event.ENTER_FRAME、Event.FRAME_CONSTRUCTED、Event.EXIT_FRAME、Event.ACTIVATE および Event.DEACTIVATE イベントが送出されなくなります。