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:
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: