수색…


벡터 기반 그래픽

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

그래픽 재사용 및 풀링

런타임에 SpriteTextField 객체를 만들고 구성하는 것은 단일 프레임에 수십만 개의 객체를 만드는 경우 비용이 많이 듭니다. 따라서 공통적 인 트릭은 이러한 객체를 나중에 다시 사용할 수 있도록 "풀링"하는 것입니다. 우리는 생성 시간 ( 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