가능하면 객체를 다시 만들지 않고 재사용합니다.
메모리를 최적화하는 또 다른 방법은 가능하면 항상 객체를 재사용하고 다시 만들지 않는 것입니다. 예를 들어 루프에서 다음 코드를 사용하지 않습니다.
const MAX_NUM:int = 18;
const COLOR:uint = 0xCCCCCC;
var area:Rectangle;
for (var:int = 0; i < MAX_NUM; i++)
{
// Do not use the following code
area = new Rectangle(i,0,1,10);
myBitmapData.fillRect(area,COLOR);
}
루프를 반복할 때마다 Rectangle 객체를 다시 만들면 반복할 때마다 새 객체가 만들어지므로 메모리 사용량이 늘어나고 속도가 느려집니다. 다음 방법을 사용합니다.
const MAX_NUM:int = 18;
const COLOR:uint = 0xCCCCCC;
// Create the rectangle outside the loop
var area:Rectangle = new Rectangle(0,0,1,10);
for (var:int = 0; i < MAX_NUM; i++)
{
area.x = i;
myBitmapData.fillRect(area,COLOR);
}
이전 예제에서는 상대적으로 메모리 영향이 적은 객체를 사용했습니다. 다음 예제에서는 BitmapData 객체를 재사용하여 메모리 사용을 크게 절약하는 것을 보여 줍니다. 바둑판 효과를 만드는 다음 코드는 메모리를 낭비합니다.
var myImage:BitmapData;
var myContainer:Bitmap;
const MAX_NUM:int = 300;
for (var i:int = 0; i< MAX_NUM; i++)
{
// Create a 20 x 20 pixel bitmap, non-transparent
myImage = new BitmapData(20,20,false,0xF0D062);
// Create a container for each BitmapData instance
myContainer = new Bitmap(myImage);
// Add it to the display list
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
}
참고:
양수 값을 사용하고 반올림된 값을 int로 형 변환하는 것이
Math.floor()
메서드를 사용하는 것보다 훨씬 빠릅니다.
다음 이미지는 비트맵 바둑판의 결과를 보여 줍니다.
최적화된 버전에서는 여러 Bitmap 인스턴스에서 참조하는 단일 BitmapData 인스턴스를 만들고 같은 결과를 생성합니다.
// Create a single 20 x 20 pixel bitmap, non-transparent
var myImage:BitmapData = new BitmapData(20,20,false,0xF0D062);
var myContainer:Bitmap;
const MAX_NUM:int = 300;
for (var i:int = 0; i< MAX_NUM; i++)
{
// Create a container referencing the BitmapData instance
myContainer = new Bitmap(myImage);
// Add it to the display list
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
}
이 방법은 약 700KB의 메모리를 절약하며, 이는 일반적인 휴대 장치에서 상당히 큰 절약 수치입니다. 각 비트맵 컨테이너는 Bitmap 속성을 사용하여 원래 BitmapData 인스턴스를 변경하지 않고도 조작할 수 있습니다.
// Create a single 20 x 20 pixel bitmap, non-transparent
var myImage:BitmapData = new BitmapData(20,20,false,0xF0D062);
var myContainer:Bitmap;
const MAX_NUM:int = 300;
for (var i:int = 0; i< MAX_NUM; i++)
{
// Create a container referencing the BitmapData instance
myContainer = new Bitmap(myImage);
// Add it to the DisplayList
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
// Set a specific rotation, alpha, and depth
myContainer.rotation = Math.random()*360;
myContainer.alpha = Math.random();
myContainer.scaleX = myContainer.scaleY = Math.random();
}
다음 이미지는 비트맵 변환의 결과를 보여 줍니다.