Riutilizzate gli oggetti quando è possibile, anziché ricrearli.
Un altro modo semplice per ottimizzare la memoria consiste nel riutilizzare gli oggetti ed evitare di ricrearli, quando è possibile. Ad esempio, in un ciclo, non utilizzate il codice seguente:
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);
}
Ricreando l'oggetto Rectangle in ogni iterazione di ciclo si utilizza più memoria e i tempi si allungano perché a ogni iterazione viene creato un nuovo oggetto. Adottate l'approccio seguente:
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);
}
Nell'esempio precedente è stato utilizzato un oggetto che ha un impatto relativamente modesto sulla memoria. L'esempio seguente invece illustra un caso di risparmio di memoria più consistente grazie al riutilizzo di un oggetto BitmapData. Il codice seguente usato per creare un effetto "a piastrelle" determina uno spreco di memoria:
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);
}
Nota:
quando si usano valori positivi, l'inserimento del valore arrotondato in int è molto più veloce rispetto all'uso del metodo
Math.floor()
.
L'immagine seguente mostra il risultato dell'effetto a piastrelle sulla bitmap:
Una versione ottimizzata crea un'istanza BitmapData singola alla quale fanno riferimento più istanze Bitmap, producendo lo stesso risultato:
// 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);
}
Questa soluzione permette di risparmiare circa 700 KB di memoria, ovvero una quantità significativa per un dispositivo mobile tradizionale. Ogni contenitore bitmap può essere modificato senza alterare l'istanza BitmapData originale utilizzando le proprietà Bitmap:
// 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();
}
L'immagine seguente mostra il risultato delle trasformazioni bitmap: