オブジェクトの再利用

可能な場合は、同じオブジェクトを繰り返し作成する代わりに再利用してください。

メモリを最適化するもう一つの簡単な方法は、できる限りオブジェクトを再利用して、同じオブジェクトを繰り返し作成しないようにすることです。例えば、ループ内で次のコードは使用しないでください。

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); 
}
注意: 正の値を使用する場合は、四捨五入された値を整数に型変換する方が Math.floor() メソッドを使用するよりもはるかに高速に処理されます。

次の図は、ビットマップタイリングの結果を示しています。

フルサイズのグラフィックを表示
ビットマップタイリングの結果

最適化されたバージョンでは、BitmapData インスタンスを 1 つ作成して、それを複数の Bitmap インスタンスで参照することにより、同じ結果をもたらします。

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

この手法は、メモリを約 700 KB 節約します。これは、従来のモバイルデバイスにとって、大幅なメモリの節約になります。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(); 
}

次の図は、ビットマップ変形の結果を示しています。

フルサイズのグラフィックを表示
ビットマップ変形の結果