Återanvända objekt

Du ska återanvända objekt i stället för att återskapa dem.

Ytterligare ett enkelt sätt att optimera minnet är att återanvända objekt och undvika att återskapa dem när det är möjligt. I en slinga ska du exempelvis inte använda följande kod:

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

När du återanvänder Rectangle-objekt i varje slingiteration används mer minne och det går långsammare eftersom ett nytt objekt skapas vid varje iteration. Gör i stället få följande sätt:

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

I det föregående exemplet användes ett objekt med en relativ liten minnespåverkan. I nästa exempel visas större minnesbesparingar när ett BitmapData-objekt återanvänds. Med följande kod skapas en indelningseffekt som kräver mycket minneskapacitet:

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); 
}
Obs! När du använder positiva värden är det mycket effektivare att göra det avrundade värdet till int än att använda metoden Math.floor() .

I följande bild visas resultatet av bitmappsindelningen:

Visa grafik i full storlek
Resultat av bitmappsindelning

I en optimerad version skapas en enskild BitmapData-instans som refereras av flera bitmappsinstanser och som ger samma resultat:

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

Detta arbetssätt sparar cirka 700 kB av minnet, vilket är en avsevärd besparing i traditionella mobilenheter. Varje bitmappsbehållare kan hanteras utan att den ursprungliga BitmapData-instansen behöver ändras med bitmappsegenskaperna:

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

I följande bild visas resultatet av bitmappsomformningarna:

Visa grafik i full storlek
Resultat av bitmappsomformningar