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/
링크를 참조하십시오.