표시 객체 캐싱

Flash Player 9 이상, Adobe AIR 1.0 이상

응용 프로그램을 작성하든 스크립팅된 복잡한 애니메이션을 작성하든 Flash에서 작업하는 디자인은 규모가 커질 수 있으므로, 성능 및 최적화를 고려해야 합니다. 사각형 Shape 인스턴스와 같이 정적으로 유지되는 내용은 Flash Player와 AIR에서 자동으로 최적화되지 않습니다. 따라서 사각형의 위치를 변경할 경우 Flash Player나 AIR에서는 전체 Shape 인스턴스가 다시 그려집니다.

지정된 표시 객체를 캐시하여 SWF 파일의 성능을 향상시킬 수 있습니다. 표시 객체는 기본적으로 인스턴스 벡터 데이터의 비트맵 버전인 표면이며, 이것은 SWF 파일을 만드는 과정에서 자주 변경하지 않는 데이터입니다. 그러므로 캐싱이 활성화된 인스턴스는 SWF 파일이 재생될 때 계속적으로 다시 그려지지 않습니다. 따라서 SWF 파일은 빠르게 렌더링됩니다.

참고: 벡터 데이터는 표면이 다시 만들어질 때 업데이트할 수 있습니다. 그러므로 표면에 캐싱된 벡터 데이터는 전체 SWF 파일에서 동일하게 유지될 필요가 없습니다.

표시 객체의 cacheAsBitmap 속성을 true로 설정하면 표시 객체가 자체 비트맵 표현을 캐시합니다. Flash Player나 AIR에서는 인스턴스에 대해 표면 객체가 만들어지며 이 객체는 벡터 데이터 대신에 비트맵으로 캐시된 것입니다. 표시 객체의 경계를 변경하면 표면은 크기가 조절되지 않고 다시 만들어집니다. 표면은 서로 다른 표면 안에 중첩이 가능합니다. 이 경우, 자식 표면은 부모 표면으로 비트맵을 복제하게 됩니다. 자세한 내용은 비트맵 캐싱 활성화을 참조하십시오.

DisplayObject 클래스의 opaqueBackgroundscrollRect 속성은 cacheAsBitmap 속성을 사용하여 비트맵 캐싱과 연관됩니다. 위 세 가지 속성은 서로 독립적이지만, opaqueBackgroundscrollRect 속성은 객체가 비트맵으로 캐시되는 경우 가장 잘 작동합니다. 즉, opaqueBackgroundscrollRect 속성은 cacheAsBitmaptrue로 설정된 경우에만 성능상의 이점을 제공합니다. 표시 객체 내용 스크롤에 대한 자세한 내용은 표시 객체 패닝 및 스크롤을 참조하십시오. 불투명 배경 설정에 대한 자세한 내용은 불투명한 배경색 설정을 참조하십시오.

알파 채널 마스크를 사용하려면 cacheAsBitmap 속성을 true로 설정해야 합니다. 자세한 내용은 표시 객체 마스크을 참조하십시오.

캐싱 기능이 필요한 경우

표시 객체에 캐싱을 활성화하면 표면이 만들어지며, 복잡한 벡터 애니메이션을 빠르게 렌더링할 수 있는 등 여러 이점이 있습니다. 몇몇 상황에서는 캐싱을 활성화하는 것이 좋습니다. SWF 파일의 성능을 향상하려면 항상 캐싱을 활성화하는 것이 좋을 것처럼 보이지만, 캐싱을 활성화해도 성능이 향상되지 않거나 오히려 저하되는 경우도 있습니다. 이 단원에서는 캐싱을 사용해야 할 경우와 일반 표시 객체를 사용해야 할 경우에 대해 설명합니다.

캐시된 데이터의 전체적인 성능은 인스턴스 벡터 데이터의 복잡도, 변경하려는 데이터의 양, opaqueBackground 속성의 설정 여부 등에 달려 있습니다. 작은 영역을 변경할 경우 표면과 벡터 데이터 중 어느 것을 사용해도 결과는 비슷합니다. 응용 프로그램을 배포하기 전에 두 가지 경우를 모두 테스트하는 것도 좋습니다.

비트맵 캐싱 기능이 필요한 경우

다음과 같은 경우에는 일반적으로 비트맵 캐싱을 사용할 경우 큰 이점을 얻을 수 있습니다.

  • 복잡한 배경 이미지: 섬세하고 복잡한 벡터 데이터 배경 이미지가 포함된 응용 프로그램을 사용할 경우로, 비트맵 추적 명령을 적용한 이미지 또는 Adobe Illustrator®에서 작성한 아트웍 작업 등입니다. 배경에 있는 문자들에 애니메이션 효과를 적용할 수도 있으며, 그 결과 배경에서 벡터 데이터를 지속적으로 다시 생성해야 하므로 해당 애니메이션의 속도는 느려집니다. 이때 성능을 향상시키려면 배경 표시 객체의 opaqueBackground 속성을 true로 설정합니다. 배경이 비트맵으로 렌더링되고 빠르게 다시 그려지므로 애니메이션은 훨씬 더 빠르게 재생됩니다.

  • 스크롤 텍스트 필드: 스크롤 텍스트 필드에 대량의 텍스트를 표시하는 응용 프로그램을 사용할 경우입니다. 스크롤 경계선으로 스크롤이 가능하도록 설정(즉, scrollRect 속성을 설정함)한 표시 객체 안에 텍스트 필드를 배치할 수 있습니다. 이렇게 하면 지정된 인스턴스에 대해 빠른 픽셀 스크롤을 수행할 수 있습니다. 사용자가 표시 객체 인스턴스를 스크롤하면 Flash Player나 AIR에서 스크롤된 픽셀은 위쪽으로 이동하며 전체 텍스트 필드가 다시 생성되는 대신 새롭게 표시되는 영역만 생성됩니다.

  • 윈도우 시스템: 윈도우가 겹쳐지는 복잡한 구조가 포함된 응용 프로그램을 사용할 경우입니다. 각 윈도우는, 예를 들면 웹 브라우저 윈도우처럼 열려 있거나 닫혀 있을 수도 있습니다. cacheAsBitmap 속성을 true로 설정하여 각 윈도우를 표면으로 표시하면 각 윈도우는 서로 분리되고 캐시됩니다. 사용자는 윈도우를 드래그하여 서로 겹쳐지게 할 수 있으며, 각 윈도우에서는 벡터 내용을 다시 생성할 필요가 없습니다.

  • 알파 채널 마스크: 알파 채널 마스크를 사용할 경우 chacheAsBitmap 속성을 true로 설정해야 합니다. 자세한 내용은 표시 객체 마스크을 참조하십시오.

이와 같은 모든 경우에 비트맵 캐싱을 활성화하면 벡터 그래픽이 최적화되므로 응용 프로그램의 응답성 및 상호 작용성이 향상됩니다.

또한 표시 객체에 필터를 적용할 때마다 cacheAsBitmap이 자동으로 true로 설정됩니다. 이 속성을 false로 명시적으로 설정한 경우에도 마찬가지입니다. 표시 객체에서 모든 필터를 지우면 cacheAsBitmap 속성이 마지막 설정된 값으로 돌아갑니다.

비트맵 캐싱의 사용을 피해야 할 경우

이 기능을 잘못된 환경에서 사용하면 SWF 파일의 성능이 저하될 수도 있습니다. 비트맵 캐싱을 사용할 경우 다음 지침을 따라야 합니다.

  • 표면(캐싱이 활성화된 표시 객체)을 과도하게 사용하지 않습니다. 각 표면은 일반 표시 객체보다 메모리를 더 사용하므로 렌더링 성능을 향상시킬 경우에만 표면을 활성화해야 합니다.

    캐시된 비트맵은 일반 표시 객체보다 훨씬 더 많은 메모리를 사용할 수도 있습니다. 예를 들어, 스테이지 위의 크기가 250 x 250 픽셀인 Sprite 인스턴스가 캐시될 경우 250KB가 사용되는 반면에, 캐시되지 않은 일반 Sprite 인스턴스는 1KB를 사용합니다.

  • 캐시된 표면에 확대/축소를 적용하지 않습니다. 비트맵 캐싱을 남용하면 특히 내용을 확대 및 축소할 경우 상당한 양의 메모리가 소비됩니다(앞의 항목 참조).

  • 표면은 대부분 정적인, 즉 움직임이 거의 없는 표시 객체 인스턴스에 대해 사용합니다. 이 경우에 인스턴스를 드래그하거나 이동할 수 있지만 인스턴스의 내용은 움직이거나 크게 변경되어서는 안 됩니다. 애니메이션 또는 변경되는 내용은 애니메이션 또는 Video 인스턴스가 포함된 MovieClip 인스턴스와 비슷합니다. 예를 들어 인스턴스를 회전하거나 변형하면 해당 인스턴스는 표면 및 벡터 데이터간에서 전환되는데, 이는 처리하기 어려운 작업이며 SWF 파일에 부정적인 영향을 미치기도 합니다.

  • 표면을 벡터 데이터와 혼합하면 Flash Player 및 AIR(때로는 컴퓨터)에서 수행해야 하는 처리 작업이 증가됩니다. 가능하면 표면을 서로 그룹화하는 것이 좋으며, 예를 들어 윈도우 응용 프로그램을 만드는 경우가 여기에 해당합니다.

  • 그래픽이 자주 변경되는 객체는 캐시하지 않는 것이 좋습니다. 크기 조절, 기울이기, 표시 객체 회전, 알파 또는 색상 변형 변경, 자식 표시 객체 이동, 그래픽 속성을 사용한 그리기 등을 수행할 때마다 비트맵 캐시는 다시 그려집니다. 이러한 작업이 모든 프레임에서 이루어지면 런타임에서 객체를 비트맵으로 그린 다음 해당 비트맵을 스테이지로 복사해야 하며, 이 경우 캐시되지 않은 객체를 스테이지에 그릴 때와 달리 추가적인 작업이 발생합니다. 캐싱 및 업데이트 빈도 간 성능상의 균형 조건은 표시 객체의 복잡도와 크기에 따라 달라지며 특정 내용을 테스트한 후에만 결정할 수 있습니다.

비트맵 캐싱 활성화

표시 객체에 대한 비트맵 캐싱을 활성화하려면 cacheAsBitmap 속성을 true로 설정합니다.

mySprite.cacheAsBitmap = true;

cacheAsBitmap 속성을 true로 설정하면 표시 객체가 전체 좌표를 기준으로 자동으로 픽셀에 물리는 것을 볼 수 있습니다. SWF 파일을 테스트하면 복잡한 벡터 이미지에서 수행되는 애니메이션이 더욱 빠르게 렌더링되는 것이 보입니다.

다음 중 한 가지 이상의 경우에 해당되면 cacheAsBitmaptrue로 설정되었더라도 표면(캐시된 비트맵)이 만들어지지 않습니다.

  • 비트맵의 높이나 너비가 2880 픽셀을 초과한 경우

  • 메모리 부족으로 비트맵 할당에 실패한 경우

캐시된 비트맵 변형 행렬

휴대 장치용 AIR 응용 프로그램에서 cacheAsBitmap 속성을 설정할 때마다 cacheAsBitmapMatrix 속성도 설정해야 합니다. 이 속성을 설정하면 재렌더링을 트리거하지 않고 표시 객체에 더 다양한 변형을 적용할 수 있습니다.

mySprite.cacheAsBitmap = true; 
mySprite.cacheAsBitmapMatrix = new Matrix();

이 행렬 속성을 설정하면 객체를 다시 캐시하지 않고 표시 객체에 다음의 추가적인 변형을 적용할 수 있습니다.

  • 픽셀 물리기 없는 이동 또는 변환

  • 회전

  • 크기 조절

  • 경사

  • 알파 변경(0~100%의 투명도 범위)

이러한 변형은 캐시된 비트맵에 직접 적용됩니다.