CPU 사용 최소화

최적화에서 중점적으로 설명할 또 다른 중요 영역은 CPU 사용입니다. CPU 처리를 최적화하면 성능이 향상되고, 그 결과 휴대 장치의 배터리 수명도 늘어납니다.

Flash Player 10.1의 CPU 사용 관련 향상 기능

Flash Player 10.1에는 CPU 처리를 줄이는 데 유용한 두 가지 새 기능이 추가되었습니다. 이 기능은 SWF 내용이 화면에서 사라졌을 때 일시 정지하고 다시 시작하는 작업과 더불어, 한 페이지에 표시할 수 있는 Flash Player 인스턴스를 제한하는 것과 관련이 있습니다.

일시 정지, 제한 및 다시 시작

참고: 일시 정지, 제한 및 다시 시작 기능은 Adobe® AIR® 응용 프로그램에 적용되지 않습니다.

CPU 및 배터리 사용을 최적화하기 위해 Flash Player 10.1에는 비활성 인스턴스와 관련된 새로운 기능이 추가되었습니다. 이 기능을 사용하면 내용이 화면에서 사라졌다가 표시될 때 SWF 파일을 일시 정지했다가 다시 시작하여 CPU 사용을 제한할 수 있습니다. 이 기능을 사용하면 Flash Player가 내용 재생을 다시 시작할 때 다시 만들 수 있는 객체를 제거하여 메모리를 가능한 한 많이 확보할 수 있습니다. 내용은 전체 내용이 화면을 벗어날 때 화면을 벗어나는 것으로 간주됩니다.

SWF 내용이 화면을 벗어나는 이유는 다음 두 가지가 있습니다.

  • 사용자가 페이지를 스크롤하여 SWF 내용이 화면을 벗어납니다.

    이 경우 재생 중인 오디오 또는 비디오가 있으면 내용은 계속 재생되지만 렌더링은 중지됩니다. 재생 중인 오디오 또는 비디오가 없으면 재생이나 ActionScript 실행이 일시 정지되지 않도록 hasPriority HTML 매개 변수를 true로 설정합니다. 그러나 SWF 내용이 화면을 벗어나거나 숨겨지면 hasPriority HTML 매개 변수의 값에 상관없이 해당 내용 렌더링이 일시 정지됩니다.

  • 브라우저에 탭이 열려 있어 SWF 내용이 백그라운드로 이동합니다.

    이 경우 hasPriority HTML 태그의 값에 상관없이 SWF 내용의 속도가 2fps에서 8fps 사이로 느려지거나 제한 됩니다. SWF 내용이 다시 표시되지 않는 경우 오디오 및 비디오 재생이 중지되고 내용 렌더링이 처리되지 않습니다.

Windows 및 Mac 데스크톱 브라우저에서 실행되는 Flash Player 11.2 이상 버전의 경우 응용 프로그램에서 ThrottleEvent를 사용할 수 있습니다. Flash Player는 재생을 일시 정지, 제한 또는 다시 시작할 때 ThrottleEvent를 전달합니다.

ThrottleEvent는 브로드캐스트 이벤트입니다. 즉, 이 이벤트에 등록된 리스너가 있는 모든 EventDispatcher 객체를 통해 전달됩니다. 브로드캐스트 이벤트에 대한 자세한 내용은 DisplayObject 클래스를 참조하십시오.

인스턴스 관리

참고: 인스턴스 관리 기능은 Adobe® AIR® 응용 프로그램에 적용되지 않습니다.
hasPriority HTML 매개 변수를 사용하여 SWF 파일의 로드를 지연합니다.

Flash Player 10.1에는 hasPriority 라는 새로운 HTML 매개 변수가 도입되었습니다.

<param name="hasPriority" value="true" />

이 기능은 페이지에서 시작되는 Flash Player 인스턴스의 수를 제한합니다. 인스턴스 수를 제한하면 CPU 및 배터리 리소스를 절약하는 데 도움이 됩니다. 이 매개 변수는 특정 우선 순위를 SWF 내용에 할당하여 페이지에서 내용의 우선 순위를 지정하기 위해 만들어졌습니다. 사용자가 웹 사이트를 탐색하고 인덱스 페이지에서 세 가지 다른 SWF 파일을 호스트하는 간단한 예를 고려해 봅니다. 세 파일 중 하나는 완전히 표시되고 또 다른 하나는 화면에 부분적으로 표시되며 마지막 하나는 화면을 벗어나기 때문에 스크롤이 필요합니다. 처음 두 애니메이션은 정상적으로 시작되지만 마지막 하나는 화면에 나타날 때까지 시작되지 않습니다. 이 시나리오는 hasPriority 매개 변수가 없거나 false 로 설정되어 있는 경우의 기본 비헤이비어입니다. SWF 파일이 화면에서 벗어난 경우에도 시작되도록 하려면 hasPriority 매개 변수를 true 로 설정합니다. 그러나 hasPriority 매개 변수의 값에 상관없이 사용자에게 표시되지 않는 SWF 파일의 렌더링은 항상 일시 정지됩니다.

참고: 사용 가능한 CPU 리소스가 부족해지면 hasPriority 매개 변수가 true 로 설정된 경우에도 Flash Player 인스턴스가 더 이상 자동으로 시작되지 않습니다. 페이지가 로드된 후 JavaScript를 통해 만들어진 새 인스턴스는 hasPriority 플래그를 무시합니다. 웹 마스터가 hasPriority 플래그를 포함시키지 않은 경우 1x1 픽셀 또는 0x0 픽셀 내용이 시작되어 도우미 SWF 파일이 지연되지 않도록 합니다. 그러나 클릭할 경우에는 SWF 파일이 시작될 수 있습니다. 이 비헤이비어를 "클릭하여 재생(click to play)"이라고 합니다.

다음 다이어그램에서는 hasPriority 매개 변수를 다른 값으로 설정할 경우의 효과를 보여 줍니다.

hasPriority 매개 변수의 값에 따른 다양한 효과

hasPriority 매개 변수의 값에 따른 다양한 효과

절전 모드

Flash Player 10.1 및 AIR 2.5에는 CPU 처리를 줄이고, 결과적으로 배터리 수명을 늘리는 데 도움이 되는 휴대 장치용 새 기능이 도입되었습니다. 이 기능은 많은 휴대 장치에서 볼 수 있는 백라이트 기능과 관련됩니다. 예를 들어 사용자가 모바일 응용 프로그램 실행을 중단하고 장치의 사용을 중지하는 경우 런타임에서 백라이트가 절전 모드로 전환되었음을 감지하여 프레임 속도를 4프레임/초(fps)로 줄이고 렌더링을 일시 정지합니다. AIR 응용 프로그램의 경우 응용 프로그램이 백그라운드로 이동할 때 절전 모드가 시작됩니다.

ActionScript 코드는 절전 모드에서 계속 실행됩니다. 이것은 Stage.frameRate 속성을 4fps로 설정하는 것과 비슷하지만, 렌더링 단계를 건너뛰므로 사용자는 플레이어가 4fps에서 실행 중임을 인식할 수 없습니다. 프레임 속도를 0이 아닌 4fps로 선택한 것은 모든 연결(NetStream, Socket 및 NetConnection)을 열려 있는 상태로 유지할 수 있기 때문입니다. 프레임 속도를 0으로 설정하면 열려 있는 연결이 끊깁니다. 새로 고침 속도를 250ms(4fps)로 선택한 이유는 대부분의 장치 제조업체에서 이 프레임 속도를 새로 고침 속도로 사용하기 때문입니다. 이 값을 사용하면 런타임의 프레임 속도가 장치 자체의 속도와 거의 비슷하게 유지됩니다.

참고: 런타임에서 절전 모드인 경우 Stage.frameRate 속성은 4fps가 아닌 원본 SWF 파일의 프레임 속도를 반환합니다.

백라이트가 정상 모드로 다시 전환되면 렌더링이 다시 시작되고 프레임 속도도 원래 값으로 돌아갑니다. 사용자가 음악을 재생하고 있는 미디어 플레이어 응용 프로그램을 고려해 봅니다. 화면이 절전 모드로 전환되면 런타임은 재생 중인 내용의 유형에 따라 응답합니다. 다음 목록에는 여러 가지 경우와 해당 런타임 비헤이비어가 나열되어 있습니다.

  • 백라이트가 절전 모드로 전환되고 A/V 내용이 재생되고 있지 않은 경우 렌더링이 일시 정지되고 프레임 속도가 4fps로 설정됩니다.

  • 백라이트가 절전 모드로 전환되고 A/V 내용이 재생되고 있는 경우 런타임에서 백라이트를 항상 켜진 상태로 두고 사용자 환경을 계속 유지합니다.

  • 백라이트가 절전 모드에서 정상 모드로 전환되는 경우 런타임에서 프레임 속도를 원래 SWF 파일 프레임 속도 설정으로 지정하고 렌더링을 다시 시작합니다.

  • A/V 내용이 재생되는 동안 Flash Player가 일시 정지되는 경우 A/V가 더 이상 재생되지 않기 때문에 Flash Player는 백라이트 상태를 기본 시스템 비헤이비어로 다시 설정합니다.

  • A/V 내용을 재생하는 동안 휴대 장치에서 전화를 수신하는 경우 렌더링이 일시 정지되고 프레임 속도가 4fps로 설정됩니다.

  • 휴대 장치에서 백라이트 절전 모드가 해제된 경우 런타임에서 정상적으로 동작합니다.

백라이트가 절전 모드로 전환되는 경우 렌더링이 일시 정지되고 프레임 속도가 느려집니다. 이 기능은 CPU 처리를 줄이지만 게임 응용 프로그램에서처럼 실제 일시 정지를 만드는 데 사용할 수 없습니다.

참고: 런타임에서 절전 모드가 시작되거나 끝날 때 ActionScript 이벤트가 전달됩니다.

객체 표시 제거 및 표시 제거 취소

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 전달이 중지됩니다.

이벤트 활성화 및 비활성화

Event.ACTIVATE Event.DEACTIVATE 이벤트를 사용하면 백그라운드의 활동이 중단된 것을 감지하여 응용 프로그램을 그에 맞게 최적화할 수 있습니다.

두 이벤트( Event.ACTIVATE Event.DEACTIVATE )는 응용 프로그램을 미세하게 조정할 수 있도록 지원하므로 가급적 CPU 주기를 거의 사용하지 않습니다. 이들 이벤트를 사용하면 런타임이 포커스를 얻거나 잃을 때를 감지합니다. 그러므로 컨텍스트의 변화에 맞게 코드를 최적화할 수 있습니다. 다음은 이 두 이벤트를 수신하고 응용 프로그램이 포커스를 잃으면 동적으로 프레임 속도를 0으로 변경하는 코드입니다. 예를 들어 사용자가 다른 탭으로 전환하거나 응용 프로그램을 백그라운드에 배치하면 애니메이션은 포커스를 잃을 수 있습니다.

var originalFrameRate:uint = stage.frameRate; 
var standbyFrameRate:uint = 0; 
  
stage.addEventListener ( Event.ACTIVATE, onActivate ); 
stage.addEventListener ( Event.DEACTIVATE, onDeactivate ); 
  
function onActivate ( e:Event ):void 
{ 
    // restore original frame rate 
    stage.frameRate = originalFrameRate; 
} 
  
function onDeactivate ( e:Event ):void 
{ 
    // set frame rate to 0 
    stage.frameRate = standbyFrameRate; 
}

응용 프로그램이 포커스를 다시 획득하면 프레임 속도는 원래 값으로 재설정됩니다. 프레임 속도를 동적으로 변경하는 대신, 객체를 표시 제거하거나 표시 제거 취소 등의 다른 최적화 방법을 사용할 수도 있습니다.

이벤트를 활성화하거나 비활성화하면 휴대 장치 및 넷북에 종종 있는 "일시 정지 및 다시 시작" 기능과 유사한 메커니즘을 구현할 수 있습니다.

마우스 상호 작용

가능한 경우 마우스 상호 작용을 비활성화해 봅니다.

대화형 객체(예: MovieClip 또는 Sprite 객체)를 사용하는 경우 런타임에서는 기본 코드를 실행하여 마우스 상호 작용을 감지하고 처리합니다. 많은 대화형 객체가 화면에 표시되는 경우, 특히 서로 겹치는 경우 마우스 상호 작용을 감지하는 데 CPU가 많이 사용될 수 있습니다. 이러한 처리를 방지하는 쉬운 방법은 마우스 상호 작용이 필요하지 않은 객체에 대해 마우스 상호 작용을 비활성화하는 것입니다. 다음 코드에서는 mouseEnabled mouseChildren 속성의 사용을 보여 줍니다.

// Disable any mouse interaction with this InteractiveObject 
myInteractiveObject.mouseEnabled = false; 
const MAX_NUM:int = 10; 
  
// Create a container for the InteractiveObjects 
var container:Sprite = new Sprite(); 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    // Add InteractiveObject to the container 
    container.addChild( new Sprite() ); 
} 
  
// Disable any mouse interaction on all the children 
container.mouseChildren = false;

가능한 경우 마우스 상호 작용을 비활성화하는 것이 좋습니다. 그러면 응용 프로그램에서 사용하는 CPU 처리가 줄어들고, 그 결과 휴대 전화의 배터리 사용도 줄어듭니다.

타이머와 ENTER_FRAME 이벤트

내용에 애니메이션을 적용하는지 여부에 따라 타이머 또는 ENTER_FRAME 이벤트를 선택합니다.

오랜 시간 동안 실행되는, 애니메이션이 적용되지 않은 내용의 경우 Event.ENTER_FRAME 이벤트보다는 타이머를 사용하는 것이 좋습니다.

ActionScript 3.0에는 특정 간격으로 한 함수를 호출할 수 있는 두 가지 방법이 있습니다. 첫 번째 방식은 표시 객체(DisplayObject)가 전달하는 Event.ENTER_FRAME 이벤트를 사용하는 것입니다. 두 번째 방식은 타이머를 사용하는 것입니다. ActionScript 개발자는 ENTER_FRAME 이벤트 방식을 자주 사용합니다. ENTER_FRAME 이벤트는 모든 프레임에서 전달됩니다. 따라서 함수가 호출되는 간격은 현재 프레임 속도와 관련됩니다. 프레임 속도에는 Stage.frameRate 속성을 통해 액세스할 수 있습니다. 그러나 일부 경우에는 ENTER_FRAME 이벤트를 사용하는 것보다 타이머를 사용하는 것이 나을 수 있습니다. 예를 들어 애니메이션은 사용하지 않지만 코드가 특정 간격으로 호출되도록 하려는 경우 타이머를 사용하는 것이 낫습니다.

타이머는 ENTER_FRAME 이벤트와 비슷한 방식으로 작동할 수 있지만 프레임 속도에 구애받지 않고 이벤트를 전달할 수 있습니다. 이 비헤이비어를 사용하면 상당한 최적화를 실현할 수 있습니다. 비디오 플레이어 응용 프로그램을 예로 들어 생각해 보겠습니다. 이 경우 응용 프로그램 컨트롤만 이동하므로 높은 프레임 속도를 사용할 필요가 없습니다.

참고: 비디오는 타임라인에 포함되지 않으므로 프레임 속도가 비디오에 영향을 주지 않습니다. 대신, 비디오는 점진적 다운로드 또는 스트리밍을 통해 동적으로 로드됩니다.

이 예제에서는 프레임 속도가 10fps의 낮은 값으로 설정되어 있습니다. 타이머는 초당 1개의 업데이트 속도로 컨트롤을 업데이트합니다. TimerEvent 객체에서 사용 가능한 updateAfterEvent() 메서드를 통해 보다 높은 업데이트 속도를 구현할 수 있습니다. 이 메서드에서는 필요한 경우 타이머가 이벤트를 전달할 때마다 화면을 강제로 업데이트합니다. 다음 코드에서는 이러한 아이디어를 보여 줍니다.

// Use a low frame rate for the application 
stage.frameRate = 10; 
  
// Choose one update per second 
var updateInterval:int = 1000; 
var myTimer:Timer = new Timer(updateInterval,0); 
  
myTimer.start(); 
myTimer.addEventListener( TimerEvent.TIMER, updateControls ); 
  
function updateControls( e:TimerEvent ):void 
{ 
    // Update controls here 
    // Force the controls to be updated on screen 
    e.updateAfterEvent(); 
}

updateAfterEvent() 메서드를 호출해도 프레임 속도가 수정되지는 않습니다. 이 메서드는 단지 런타임에서 변경된 화면의 내용을 강제로 업데이트합니다. 타임라인은 여전히 10fps로 실행됩니다. 타이머 및 ENTER_FRAME 이벤트는 성능이 낮은 장치에서 또는 이벤트 핸들러 함수에 처리량이 많은 코드가 포함된 경우에는 완벽히 정확하게 작동하지 않습니다. SWF 파일 프레임 속도와 마찬가지로 타이머의 업데이트 프레임 속도는 일부 상황에서 달라질 수 있습니다.

응용 프로그램에서 Timer 객체 및 등록된 enterFrame 핸들러의 수를 최소화하십시오.

런타임에서는 프레임마다 표시 목록에 있는 각 표시 객체에 enterFrame 이벤트를 전달합니다. 여러 표시 객체를 사용하여 enterFrame 이벤트에 대한 리스너를 등록할 수도 있지만 이렇게 하면 결국 프레임마다 더 많은 코드가 실행됩니다. 대신 각 프레임을 실행하기 위한 코드를 모두 실행하는 중앙화된 단일 enterFrame 핸들러를 사용하는 것이 좋습니다. 이렇게 코드를 중앙화하면 자주 실행되는 모든 코드를 쉽게 관리할 수 있습니다.

또한 Timer 객체를 사용하는 경우 여러 Timer 객체로부터 이벤트를 만들고 전달하기 위해 오버헤드가 발생할 수 있습니다. 서로 다른 간격으로 여러 작업을 트리거해야 하는 경우에는 다음 몇 가지 대안을 고려해 보십시오.

  • 작업의 수행 빈도에 따라 Timer 객체 및 그룹 작업 수를 최소한으로 사용하십시오..

    예를 들어, 자주 수행되는 작업에 대해 하나의 Timer를 사용하고 100밀리초마다 트리거되도록 설정합니다. 자주 수행되지 않거나 백그라운드로 수행되는 작업에 대해서도 다른 Timer를 만들고 2000밀리초마다 트리거되도록 설정합니다.

  • 단일 Timer 객체를 사용하고 Timer 객체의 delay 속성 간격의 배수로 작업이 트리거되도록 하십시오.

    예를 들어, 100밀리초마다 실행되어야 하는 작업이 있고, 200밀리초마다 실행되어야 하는 작업이 있다고 가정해 보십시오. 이 경우에는 delay 값이 100밀리초로 설정된 단일 Timer 객체를 사용합니다. 그리고 timer 이벤트 핸들러에서 매 다음 회수마다 200밀리초 작업만 실행하도록 하는 조건문을 추가합니다. 다음 예제에서는 이 방법을 보여 줍니다.

    var timer:Timer = new Timer(100); 
    timer.addEventListener(TimerEvent.Timer, timerHandler); 
    timer.start(); 
         
    var offCycle:Boolean = true; 
      
    function timerHandler(event:TimerEvent):void 
    { 
        // Do things that happen every 100 ms 
         
        if (!offCycle) 
        { 
            // Do things that happen every 200 ms 
        } 
         
        offCycle = !offCycle; 
    }
사용 중이 아닐 때는 Timer 객체를 중단하십시오..

Timer 객체의 timer 이벤트 핸들러가 특정 조건에서만 작업을 수행하는 경우 true인 조건이 없으면 Timer 객체의 stop() 메서드를 호출합니다.

enterFrame 이벤트 또는 Timer 핸들러에서 화면을 다시 그려야 하는 표시 객체의 모양 변경 횟수를 최소화하십시오.

각 프레임마다 렌더링 단계에서는 해당 프레임 중에 변경된 스테이지의 부분을 새로 그립니다. 새로 그릴 영역이 크거나, 영역이 작지만 대량 또는 복잡한 표시 객체가 포함되는 경우 런타임에서 렌더링하는 데 더 많은 시간이 필요합니다. 다시 그리는데 필요한 시간을 테스트하려면 Flash Player 또는 AIR 디버깅의 "다시 그리기 영역 표시" 기능을 사용하십시오.

반복되는 액션의 성능 향상에 대한 자세한 내용은 다음 문서를 참조하십시오.

트위닝 신드롬

CPU 용량을 절약하려면 트위닝 사용을 제한하십시오. 그러면 CPU 처리, 메모리 및 배터리 수명이 절약됩니다.

데스크톱에서 Flash용 내용을 만드는 디자이너 및 개발자는 응용 프로그램에서 많은 모션 트윈을 사용하는 경향이 있습니다. 성능이 낮은 휴대 장치용 내용을 만드는 경우 모션 트윈 사용을 최소화해 보십시오. 모션 트윈 사용을 제한하면 성능이 낮은 장치에서도 내용을 보다 빠르게 실행하는 데 도움이 됩니다.