Wiederverwenden von Objekten

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:

Grafik in Originalgröße anzeigen
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:

Grafik in Originalgröße anzeigen
Resultat der Bitmaptransformationen