Riutilizzo degli oggetti

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:

Visualizzazione dell’elemento grafico a dimensioni intere
Risultato dell'effetto a piastrelle su una 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: