객체 다시 사용

가능하면 객체를 다시 만들지 않고 재사용합니다.

메모리를 최적화하는 또 다른 방법은 가능하면 항상 객체를 재사용하고 다시 만들지 않는 것입니다. 예를 들어 루프에서 다음 코드를 사용하지 않습니다.

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(); 
}

다음 이미지는 비트맵 변환의 결과를 보여 줍니다.

전체 화면으로 그래픽 보기
비트맵 변환의 결과