ActionScript 3
성능 최적화하기
수색…
벡터 기반 그래픽
벡터 기반의 그래픽은 CPU에 의해 계산되어야하는 과다한 데이터 (벡터 점, 호, 색 등)로 표현됩니다. 점과 직선이 최소 인 단순한 모양 이외의 방대한 양의 CPU 자원을 소비합니다.
"캐시로 비트 맵"플래그가 켜져 있습니다. 이 플래그는보다 신속한 다시 그리기를 위해 벡터 기반 DisplayObject를 그려 결과를 저장합니다. 이 문제의 함정은 객체에 변형이 적용되면 전체를 다시 그려서 다시 캐싱해야한다는 것입니다. 프레임 별 변환 (회전, 크기 조정 등)이 적용된 경우에는이 옵션을 전혀 켜지 않는 것보다 느려질 수 있습니다.
일반적으로 비트 맵을 사용하여 그래픽을 렌더링하는 것은 벡터 그래픽을 사용하는 것보다 훨씬 더 효율적입니다. flixel과 같은 라이브러리는 프레임 속도를 줄이지 않고도 "캔버스"에 스프라이트를 렌더링 할 때이를 활용합니다.
본문
렌더링 텍스트는 많은 CPU를 소비합니다. 글꼴은 벡터 그래픽과 비슷한 방식으로 렌더링되며 모든 문자에 대해 많은 벡터 점을 포함합니다. 텍스트를 프레임 단위로 변경하면 성능 이 저하됩니다. "비트 맵으로 캐시"플래그는 올바르게 사용하면 매우 유용합니다. 즉, 다음을 피해야합니다.
- 텍스트를 자주 변경합니다.
- 텍스트 필드의 변형 (회전, 확대 / 축소).
if
문에서 텍스트 업데이트를 래핑하는 것과 같은 간단한 기술이 큰 차이를 만듭니다.
if (currentScore !== oldScore) {
field.text = currentScore;
}
텍스트는 Flash에 내장 된 앤티 앨리어스 렌더러를 사용하거나 "장치 글꼴"을 사용하여 렌더링 할 수 있습니다. "장치 글꼴"을 사용하면 텍스트를 더 빨리 렌더링 할 수 있지만 텍스트가 들쭉날쭉하게 표시됩니다 (별칭 지정). 또한 장치 글꼴을 사용하려면 최종 사용자가 글꼴을 미리 설치해야하며 그렇지 않으면 텍스트가 사용자 PC에서 "사라질"수 있습니다.
field.embedFonts = false; // uses "device fonts"
벡터와 각 대 배열 및 for
Vector.<T>
유형 및 for each
루프에 for each
은 기존 배열 및 for
루프보다 성능이 우수합니다.
좋은:
var list:Vector.<Sprite> = new <Sprite>[];
for each(var sprite:Sprite in list) {
sprite.x += 1;
}
나쁜:
var list:Array = [];
for (var i:int = 0; i < list.length; i++) {
var sprite:Sprite = list[i];
sprite.x += 1;
}
빠른 배열 항목 제거
특정 순서로 배열을 필요로하지 않는다면, pop()
약간 사용하면 splice()
비해 엄청난 성능 향상을 얻을 수 있습니다.
배열을 splice()
할 때 해당 배열의 후속 요소 색인은 1 줄여야합니다. 배열이 크고 제거하려는 객체가 해당 배열의 시작에 가까울수록이 프로세스는 많은 양의 시간을 소비 할 수 있습니다 .
배열의 요소 순서가 마음에 들지 않으면 제거하려는 항목을 배열 끝의 pop()
항목으로 바꿀 수 있습니다. 이렇게하면 배열의 다른 모든 항목의 색인이 동일하게 유지되고 배열의 길이가 늘어남에 따라 성능이 저하되지 않습니다.
예:
function slowRemove(list:Array, item:*):void {
var index:int = list.indexOf(item);
if (index >= 0) list.splice(index, 1);
}
function fastRemove(list:Array, item:*):void {
var index:int = list.indexOf(item);
if (index >= 0) {
if (index === list.length - 1) list.pop();
else {
// Replace item to delete with last item.
list[index] = list.pop();
}
}
}
배열 대신 벡터
Flash Player 10에는 Array보다 빠른 Vector. * 일반 목록 유형이 도입되었습니다. 그러나 이것은 전적으로 사실이 아닙니다. 다음 벡터 유형은 Flash Player에서 구현되는 방식 때문에 Array 대응 객체보다 빠릅니다.
-
Vector.<int>
- 32 비트 정수의Vector.<int>
-
Vector.<uint>
- 부호없는 32 비트 정수의 벡터 -
Vector.<Double>
- 64 비트 부동 소수점 벡터
다른 모든 경우 Array를 사용하는 것이 모든 작업 (생성, 조작 등)에 대해 Vectors를 사용하는 것보다 더 효과적입니다. 그러나 코드를 "강하게 입력"하려면 속도가 느려지더라도 벡터를 사용할 수 있습니다. FlashDevelop에는 /*ObjectType*/Array
사용하여 배열의 경우에도 코드 완성 드롭 다운을 사용할 수있는 구문이 있습니다.
var wheels:Vector.<Wheel> // strongly typed, but slow
var wheels:/*Wheel*/Array // weakly typed, but faster
그래픽 재사용 및 풀링
런타임에 Sprite
및 TextField
객체를 만들고 구성하는 것은 단일 프레임에 수십만 개의 객체를 만드는 경우 비용이 많이 듭니다. 따라서 공통적 인 트릭은 이러한 객체를 나중에 다시 사용할 수 있도록 "풀링"하는 것입니다. 우리는 생성 시간 ( new Sprite()
)뿐만 아니라 구성 (기본 속성 설정)을 최적화하려고하는 것이 아니라는 것을 기억하십시오.
수백 개의 TextField 객체를 사용하여 목록 구성 요소를 작성한다고 가정 해 보겠습니다. 새 오브젝트를 작성해야 할 경우 기존 오브젝트를 재사용 할 수 있는지 확인하십시오.
var pool:Array = [];
if (pool.length > 0){
// reuse an existing TextField
var label = pool.pop();
}else{
// create a new TextField
label = new TextField();
// initialize your TextField over here
label.setDefaultTextFormat(...);
label.multiline = false;
label.selectable = false;
}
// add the TextField into the holder so it appears on-screen
// you will need to layout it and set its "text" and other stuff seperately
holder.addChild(label);
나중에 구성 요소를 파기하거나 화면에서 제거하는 경우 사용하지 않는 레이블을 풀에 다시 추가해야합니다.
foreach (var label in allLabels){
label.parent.removeChild(label); // remove from parent Sprite
pool.push(label); // add to pool
}
대부분의 경우 전역 풀 대신 사용량 당 풀을 만드는 것이 가장 좋습니다. 전역 풀 만들기의 단점은 풀에서 개체를 검색 할 때마다 개체를 다시 초기화하여 다른 기능에서 수행 한 설정을 무효화해야한다는 것입니다. 이는 똑같이 비용이 많이 들고 처음부터 풀링을 사용하면 성능이 크게 저하됩니다.