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