Ponowne wykorzystywanie obiektów

W miarę możliwości obiekty należy ponownie wykorzystywać zamiast tworzyć je od nowa.

Inną prostą metodą zmniejszenia zużycia pamięci jest ponowne wykorzystywanie obiektów, którego celem jest zapobieganie konieczności ich ponownego tworzenia. Na przykład w pętli nie należy używać następującego kodu:

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

Odtwarzanie obiektu Rectangle w iteracji każdej pętli powoduje większe zużycie pamięci i spowolnienie, ponieważ w każdej iteracji tworzony jest nowy obiekt. Należy zastosować następujące rozwiązanie:

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

W poprzednim przykładzie wykorzystano obiekt, który zajmuje stosunkowo niewiele pamięci. Następny przykład prezentuje znaczne ograniczenie zużycia pamięci poprzez ponowne wykorzystanie obiektu BitmapData. Poniższy kod służący tworzenia efektu mozaiki powoduje niepotrzebne zajmowanie pamięci:

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); 
}
Uwaga: W przypadku wartości dodatnich rzutowanie zaokrąglonej wartości na typ int skraca czas wykonywania kodu w porównaniu z zastosowaniem metody Math.floor() .

Poniższy obraz prezentuje wynik tworzenia mozaiki z bitmapy:

Powiększ obraz
Wynik tworzenia mozaiki z bitmapy:

W zoptymalizowanej wersji tworzona jest jedna instancja BitmapData, do której odwołuje się wiele instancji Bitmap, a wynik jest taki sam:

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

W tym przypadku zmniejszono wykorzystanie pamięci o około 700 kB, co stanowi znaczącą oszczędność w typowym urządzeniu mobilnym. Każdy kontener bitmapy może być modyfikowany bez zmiany oryginalnej instancji obiektu BitmapData — w tym celu należy wykorzystać właściwości 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(); 
}

Poniższy obraz prezentuje wynik transformacji bitmapy:

Powiększ obraz
Wynik transformacji bitmapy: