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();
}
[표시] 버튼을 누르면 동영상 클립이 다시 시작되고,
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 파일의 기본 타임라인에 등록된 리스너가 제거됩니다.
-
타이머 객체가 중지됩니다.
-
하드웨어 주변 장치(예: 카메라 및 마이크)가 해제됩니다.
-
모든 동영상 클립이 중지됩니다.
-
Event.ENTER_FRAME
,
Event.FRAME_CONSTRUCTED
,
Event.EXIT_FRAME
,
Event.ACTIVATE
및
Event.DEACTIVATE
전달이 중지됩니다.