Reutilização de objetos

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:

Exibir gráfico inteiro
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:

Exibir gráfico inteiro
Resultado das transformações do bitmap