Sie sollten Objekte nach Möglichkeit immer wiederverwenden, anstatt sie neu zu erstellen.
Eine weitere einfache Möglichkeit zur Optimierung der Arbeitsspeichernutzung besteht darin, Objekte nach Möglichkeit wiederzuverwenden, anstatt sie neu zu erstellen. Verwenden Sie in einer Schleife beispielsweise nicht den folgenden Code:
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);
}
Die erneute Erstellung des Rectangle-Objekts in jeder Schleifeniteration belegt mehr Arbeitsspeicher und verlangsamt die Ausführung, da in jeder Iteration ein neues Objekt erstellt wird. Verwenden Sie das folgende Verfahren:
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);
}
Das Objekt im vorherigen Beispiel belegt nur relativ wenig Arbeitsspeicher. Das nächste Beispiel zeigt, wie durch die Wiederverwendung eines BitmapData-Objekts noch mehr Arbeitsspeicher eingespart werden kann. Beim folgenden Code zur Erstellung eines Kacheleffekts wird unnötig viel Arbeitsspeicher belegt:
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);
}
Hinweis:
Bei positiven Werten ist eine Umwandlung des gerundeten Wertes in den int-Datentyp wesentlich schneller als die Verwendung der
Math.floor()
-Methode.
Die folgende Abbildung zeigt das Ergebnis der Bitmapkacheln:
Eine optimierte Version erstellt eine einzelne BitmapData-Instanz, auf die mehrere Bitmap-Instanzen verweisen. Dabei wird dasselbe Ergebnis erzielt:
// 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);
}
Bei diesem Verfahren können ca. 700 KB Arbeitsspeicher eingespart werden, was bei herkömmlichen Mobilgeräten eine bedeutende Einsparung darstellt. Jeder Bitmapcontainer kann über die Bitmap-Eigenschaften bearbeitet werden, ohne dass die ursprüngliche BitmapData-Instanz geändert werden muss:
// 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();
}
Die folgende Abbildung zeigt das Resultat der Bitmaptransformationen: