Reutilize objetos, quando possível, em vez de recriá-los.
Outra maneira simples de otimizar a memória é reutilizar objetos e evitar sua recriação, sempre que possível. Por exemplo, em um loop, não use o seguinte 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);
}
Recriar o objeto Retangle em cada iteração de repetição utiliza mais memória e é mais lento porque um novo objeto é criado a cada iteração. Use a seguinte abordagem:
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);
}
O exemplo anterior usou um objeto com um impacto relativamente pequeno na memória. O próximo exemplo demonstra uma economia maior de memória pela reutilização de um objeto BitmapData. O código a seguir para criar um efeito lado a lado desperdiça memória:
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:
Ao usar valores positivos, converter o valor arredondado em um int é muito mais rápido do que usar o método
Math.floor()
.
A imagem a seguir mostra o resultado do bitmap lado a lado:
Uma versão otimizada cria uma única instância de BitmapData a que várias instâncias de Bitmap faz referência e produz o mesmo 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);
}
Esta abordagem economiza cerca de 700 KB de memória, o que representa uma economia significativa em um dispositivo móvel tradicional. Cada container de bitmap pode ser manipulado sem a alteração da instância de BitmapData original, usando-se as propriedades de 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();
}
A imagem a seguir mostra o resultado das transformações do bitmap: