可能な場合は、同じオブジェクトを繰り返し作成する代わりに再利用してください。
メモリを最適化するもう一つの簡単な方法は、できる限りオブジェクトを再利用して、同じオブジェクトを繰り返し作成しないようにすることです。例えば、ループ内で次のコードは使用しないでください。
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();
}
次の図は、ビットマップ変形の結果を示しています。