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