수색…


벡터 기반 그래픽

벡터 기반의 그래픽은 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
}

대부분의 경우 전역 풀 대신 사용량 당 풀을 만드는 것이 가장 좋습니다. 전역 풀 만들기의 단점은 풀에서 개체를 검색 할 때마다 개체를 다시 초기화하여 다른 기능에서 수행 한 설정을 무효화해야한다는 것입니다. 이는 똑같이 비용이 많이 들고 처음부터 풀링을 사용하면 성능이 크게 저하됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow