기타 최적화

TextField 객체의 경우 += 연산자 대신 appendText() 메서드를 사용합니다.

TextField 클래스의 text 속성을 사용하여 작업하는 경우 += 연산자 대신 appendText() 를 사용합니다. appendText() 메서드를 사용하면 성능이 향상됩니다.

다음 코드 예제에서는 += 연산자를 사용하고 루프가 완료되는 데 1120ms 걸립니다.

addChild ( myTextField ); 
  
myTextField.autoSize = TextFieldAutoSize.LEFT; 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.text += "ActionScript 3"; 
} 
  
trace( getTimer() - started ); 
// output : 1120 

다음 예제에서는 += 연산자가 appendText() 메서드로 대체되었습니다.

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.appendText ( "ActionScript 3" ); 
} 
 
trace( getTimer() - started ); 
// output : 847 

이 경우 코드가 완료되는 데 847ms가 걸립니다.

가능하면 루프 외부에서 텍스트 필드를 업데이트합니다.

이 코드는 간단한 기술을 사용하여 훨씬 더 최적화할 수 있습니다. 각 루프에서 텍스트 필드를 업데이트하면 내부 프로세스가 많이 사용됩니다. 간단히 문자열을 결합하여 루프 외부의 텍스트 필드에 할당하므로 코드 실행 시간이 크게 줄어듭니다. 이 경우 코드가 완료되는 데 2ms 걸립니다.

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
 
var started:Number = getTimer(); 
var content:String = myTextField.text; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "ActionScript 3"; 
} 
  
myTextField.text = content; 
  
trace( getTimer() - started ); 
// output : 2 

HTML 텍스트를 사용하여 작업하는 경우 이전 방식은 너무 느리기 때문에 일부 경우에 Flash Player에서 Timeout 예외가 발생할 수 있습니다. 예를 들어 기본 하드웨어가 너무 느린 경우 예외가 발생할 수 있습니다.

참고: Adobe® AIR®에서는 이 예외가 발생하지 않습니다.
var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.htmlText += "ActionScript <b>2</b>"; 
} 
 
trace( getTimer() - started ); 

값을 루프 외부의 문자열에 할당하면 코드가 완료되는 데 29ms밖에 걸리지 않습니다.

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
var content:String = myTextField.htmlText; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "<b>ActionScript<b> 3"; 
} 
  
myTextField.htmlText = content; 
  
trace ( getTimer() - started ); 
// output : 29 
참고: Flash Player 10.1 및 AIR 2.5에서는 문자열에 더 적은 메모리가 사용되도록 String 클래스가 향상되었습니다.
가능하면 대괄호 연산자를 사용하지 않습니다.

대괄호 연산자를 사용하면 성능이 저하될 수 있습니다. 참조를 지역 변수에 저장하여 대괄호 연산자 사용을 피할 수 있습니다. 다음 코드 예제에서는 대괄호 연산자의 비효율적인 사용을 보여 줍니다.

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i].x = Math.random()*stage.stageWidth; 
    arraySprite[i].y = Math.random()*stage.stageHeight; 
    arraySprite[i].alpha = Math.random(); 
    arraySprite[i].rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 16 

다음과 같은 최적화된 버전에서는 대괄호 연산자의 사용이 줄어듭니다.

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
var currentSprite:Sprite; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    currentSprite = arraySprite[i]; 
     currentSprite.x = Math.random()*stage.stageWidth; 
     currentSprite.y = Math.random()*stage.stageHeight; 
     currentSprite.alpha = Math.random(); 
     currentSprite.rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 9 
가능하면 코드를 인라인으로 이동하여 코드 내 함수 호출 수를 줄입니다.

함수 호출은 리소스를 많이 소모할 수 있습니다. 코드를 인라인으로 이동하여 함수 호출 수를 줄여 봅니다. 코드를 인라인으로 이동하는 것은 최상의 성능을 얻는 데 유용한 최적화 방법입니다. 하지만 인라인 코드는 코드의 재사용을 어렵게 하므로 SWF 파일의 크기가 늘어날 수도 있다는 점에 유의해야 합니다. Math 클래스 메서드와 같은 일부 함수 호출을 사용하면 손쉽게 인라인으로 이동할 수 있습니다. 다음 코드에서는 Math.abs() 메서드를 사용하여 절대값을 계산합니다.

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = Math.abs ( currentValue ); 
} 
  
trace( getTimer() - started ); 
// output : 70

Math.abs() 에서 수행한 계산은 수동으로 수행 가능하며 인라인으로 이동할 수 있습니다.

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = currentValue > 0 ? currentValue : -currentValue; 
} 
  
trace( getTimer() - started ); 
// output : 15

함수 호출을 인라인으로 이동하면 코드가 4배 더 빨라질 수 있습니다. 이 방법은 많은 경우에 유용하지만 코드의 재사용 및 관리 측면에서 미치는 영향을 잘 알고 있어야 합니다.

참고: 코드 크기는 전반적인 플레이어 실행에 큰 영향을 미칩니다. 응용 프로그램에 많은 양의 ActionScript 코드가 포함된 경우 가상 머신에서 코드 확인 및 JIT 컴파일에 상당한 시간이 소요됩니다. 상속 계층 구조가 더 깊어지고 내부 캐시가 보다 과도하게 사용되는 경향이 있으므로 속성 조회 속도가 느려질 수 있습니다. 코드 크기를 줄이려면 Adobe® Flex® 프레임워크, TLF 프레임워크 라이브러리 또는 타사 대용량 ActionScript 라이브러리를 사용하지 마십시오.
루프의 명령문을 평가하지 않습니다.

루프 내부의 명령문을 평가하지 않으면 한층 더 최적화할 수 있습니다. 다음 코드는 배열에 대해 반복되지만 배열 길이가 각 반복에서 평가되기 때문에 최적화되어 있지 않습니다.

for (var i:int = 0; i< myArray.length; i++) 
{ 
}

값을 저장하여 다시 사용하는 것이 좋습니다.

var lng:int = myArray.length; 
 
for (var i:int = 0; i< lng; i++) 
{ 
}
while 루프에 역순을 사용합니다.

역순 while 루프는 정방향 루프보다 더 빠릅니다.

var i:int = myArray.length; 
 
while (--i > -1) 
{ 
}

이러한 팁은 ActionScript를 최적화할 수 있는 몇 가지 방법을 제공하며, 한 줄의 코드가 성능 및 메모리에 어떤 영향을 줄 수 있는지 보여 줍니다. 이 외에도 가능한 ActionScript 최적화 방법은 많이 있습니다. 자세한 내용은 http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/ 링크를 참조하십시오.