Objecten opnieuw gebruiken

Gebruik objecten indien mogelijk opnieuw, in plaats van ze opnieuw te maken.

Een andere eenvoudige manier om geheugen te optimaliseren, is het hergebruiken van objecten en ze alleen opnieuw te maken als dit onvermijdelijk is. Gebruik in een loop bijvoorbeeld de volgende code niet:

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

Het opnieuw maken van het Rectangle-object in elke loopherhaling verbruikt meer geheugen en neemt meer tijd, omdat in elke herhaling een nieuw object wordt gemaakt. Gebruik de volgende aanpak:

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

Het vorige voorbeeld gebruikt een object met een relatief klein geheugengebruik. In het volgende voorbeeld wordt weergegeven hoe u meer geheugen kunt besparen door een BitmapData-object opnieuw te gebruiken. De volgende code voor het maken van een tegeleffect verspilt geheugen:

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); 
}
Opmerking: Wanneer u positieve waarden gebruikt, is het veel sneller om de afgeronde waarde naar int te sturen dan om de Math.floor() -methode te gebruiken.

In de volgende afbeelding ziet u het resultaat van het tegeleffect voor een bitmap:

Afbeelding groot weergeven
Resultaat van het tegeleffect voor een bitmap

Een geoptimaliseerde versie maakt één BitmapData-instantie, waarnaar door meerdere Bitmap-instanties verwezen wordt en die hetzelfde resultaat heeft:

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

Deze aanpak bespaart ongeveer 700 kB geheugen; een belangrijke besparing op een traditioneel mobiel apparaat. Elke bitmapcontainer kan met behulp van de Bitmap-eigenschappen worden aangepast, zonder dat de oorspronkelijke BitmapData-instantie wordt gewijzigd.

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

In de volgende afbeelding ziet u het resultaat van de bitmaptransformaties:

Afbeelding groot weergeven
Resultaat van de bitmaptransformaties