2012-10-22 7 views
2

이 주제는 이미 사망 한 것으로 알고 있지만 답변을 찾을 수없는 매우 구체적인 질문이 있습니다.AS3에 애셋, 비트 맵 캐싱 및 비트 맵 변환 포함

내 프로그램에서 수행중인 작업은 여러 가지 모바일 자산을 확장하고 여러 모바일 플랫폼을 지원하기 위해 확장 한 다음 계속 진행하는 것입니다.

나는 비트 맵 캐싱이 모바일 응용 프로그램의 성능을 향상시키는 좋은 방법이라고 읽었습니다. 임베디드 자산과 관련하여, 이는 단순히 임베디드 자산의 단일 인스턴스를 만들고 여러 번 사용하는 행위입니까? 예를 들면 다음과 같습니다.

[Embed(source = "png.png")] private static var img:Class; 
private static var data:BitmapData = new img().bitmapData;

private var bmp1:Bitmap = new Bitmap(data); private var bmp2:Bitmap = new Bitmap(data);

"new"키워드를 사용하여 만든 모든 애셋이 메모리에 저장된 이미지의 단일 인스턴스를 참조하고 메모리의 다른 곳에있는 고유 한 복사본을 만들 것이라고 가정합니다.

다음으로 및 cacheAsBitmapMatrix 클래스의 매개 변수는 포함 된 자산을 사용할 때 이러한 속성을 설정합니다.

AS3에서 비트 맵을 확장 할 때 마지막으로, 규모 행렬을 사용하여 BitmapData을 다시 그려야하는 것이 더는 Bitmap 클래스의 scaleXscaleY 속성을 사용하는 것이 더 효율적이다, 또는인가?

미리 도움을 청하십시오!

답변

2

예, 포함 된 파일에서 추출한 BitmapData 인스턴스는 하나만 존재합니다. 이렇게하면 메모리가 절약되지만 BitmapData를 변경하면 해당 비트 맵을 참조하는 모든 비트 맵에 영향을 미칩니다. 그러나 BitmapData 자체를 편집하지 않거나 그렇게하면 비트 맵 데이터를 모두 업데이트하려는 경우 문제가되지 않습니다. .

new 키워드로 생성 된 각 비트 맵은 메모리의 고유 한 개체가되지만 해당 콘텐츠에 대해 동일한 BitmapData (data)를 모두 참조합니다. BitmapData를 픽셀 데이터의 핵심 설명으로 생각하고 Bitmap을 래퍼로 생각합니다 그 데이터를 무대에 그릴 수 있습니다. 당신이 비트 맵을 데이터의 고유 사본을 제공 할 경우 코드에서 생성 한 비트 맵의 ​​각이 동일한의 BitmapData을 참조, 인스턴스화 :

var uniqueBitmap:Bitmap = new Bitmap(data.clone()); 

을 ... 나중에이 액세스하려는 경우, 당신은 비트 맵 인스턴스를 통해 그것을 할 수있는 것은 :

uniqueBitmap.bitmapData; 

그러나 이것은 당신이 실제로 개별적으로 조작해야하는 경우 그래서에만이 작업을 수행, 메모리에있는 다른 BitmapData 객체를 생성합니다.

두 번째 부분은 개인적으로 스케일링이 순수한 시각적 효과 (예 : 게임)를위한 것이었고 자주 사용하는 경우 scaleX & 래퍼 비트 맵의 ​​scaleY를 사용했습니다. Matrix를 사용하면 BitmapData의 크기가 조정되지 않습니다. , 그것의 스케일 된 사본을 만들 것입니다, 그래서 당신이 모바일 장치를 대상으로하는 경우, 매번 새로운 BitmapData 인스턴스를 생성 할 때 일반적인 변환을 위해이 메서드를 사용하는 것이 이상적이지 않을 수 있습니다. 그것은 정말로 당신의 목적에 달려 있습니다 - 당신이하려는 것을 물어봐도 될까요?

+0

비트 맵 정보에 대한 정보를 주셔서 감사합니다. 내일 몇 가지 테스트를 실시 할 예정입니다. 스케일링에 관한 한, 콘텐츠를 스케일링하는 이유는 모바일 장치의 해상도가 달라지기 때문입니다. 원본 텍스처는 640x960 (iPhone4)이지만 다른 해상도의 장치를 포함하여 여러 장치에서 작동하기를 원하기 때문에 장치 창이로드 될 때 그래픽을 확장해야 장치 창에 맞출 수 있습니다. 이유 나는이 방법을 사용하고 있습니다. 왜냐하면 stage.ScaleMode가 나를 위해 작동하지 않는 것처럼 보이기 때문입니다.하지만 아마도 Flixel을 사용했기 때문일 수 있습니다. – Eternalspirit

+1

아 글쎄 -이 경우 Matrix-scaleX/Y를 각 프레임마다 계산해야하기 때문에 비트 맵을 몇 프레임 (즉, 축소하는 애니메이션)으로만 조정해야하지만 유용 할 수 있습니다. 불필요하게 각 프레임을 계산합니다 (한 번만 변경하는 경우). 영구 변환을 원한다면 Matrix를 사용하십시오. 이것이 당신을 혼란스럽게하지 않았 으면 좋겠다. – MickMalone1983

+0

그래, 한 번만 확장 한 다음 항상 확장 된 BitmapData를 사용해야합니다. 매 프레임마다 스케일을 다시 계산할 필요가 없습니다. 왜냐하면 이미지를 항상 스케일링하기를 원하기 때문입니다. – Eternalspirit