Reutilización de objetos

Si es posible, reutilice los objetos en lugar de volver a crearlos.

Otra forma sencilla de optimizar la memoria consiste en reutilizar objetos y evitar su recreación siempre que sea posible. Por ejemplo, en un bucle, no utilice el siguiente código:

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

Al volver a crear el objeto Rectangle en cada iteración del bucle se utiliza más memoria y el proceso es más lento, ya que se crea un nuevo objeto en cada iteración. Utilice el siguiente enfoque:

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

El ejemplo anterior utilizaba un objeto con un impacto de memoria relativamente pequeño. En el siguiente ejemplo se muestra un mayor ahorro de memoria mediante la reutilización de un objeto BitmapData. El siguiente código utilizado para crear un efecto mosaico supone un desaprovechamiento de 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: cuando se utilizan valores positivos, la conversión del valor redondeado a int resulta mucho más rápido que el uso del método Math.floor() .

La siguiente imagen muestra el resultado del mosaico del mapa de bits:

Ver gráfico a tamaño completo
Resultado del mosaico de mapa de bits

Una versión optimizada crea un sola instancia de BitmapData a la que se hace referencia mediante varias instancias de Bitmap y se produce el mismo resultado:

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

Con este enfoque se ahorran unos 700 KB de memoria, lo cual representa un ahorro significativo en un dispositivo móvil tradicional. Todos los contenedores de mapas de bits se pueden manipular sin modificar la instancia de BitmapData original y utilizando las propiedades 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(); 
}

La siguiente imagen muestra el resultado de las transformaciones del mapa de bits:

Ver gráfico a tamaño completo
Resultado de las transformaciones del mapa de bits