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