По возможности используйте объекты повторно вместо их повторного создания.
Другим простым способом оптимизации памяти является повторное использование объектов и по возможности предотвращение их повторного создания. Например, в цикле не используйте следующий код:
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);
}
Воссоздание объекта Rectangle в каждом цикле итерации требует больше ресурсов памяти и выполняется медленнее, так как каждый раз приходится снова создавать объект. Используйте следующий подход:
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);
}
В предыдущем примере объект использовался с относительно небольшим потреблением ресурсов памяти. Следующий пример демонстрирует еще большую экономию памяти за счет повторного использования объекта BitmapData. Следующий код для создания эффекта плитки неэффективно использует память.
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);
}
Примечание.
При использовании положительных значений преобразование округленного значения в тип int выполняется гораздо быстрее, чем при использовании метода
Math.floor()
.
На следующем рисунке показан результат разбиения растрового изображения на плитки.
В оптимизированной версии создается один экземпляр BitmapData, на который ссылаются несколько экземпляров 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 display list
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
}
Этот подход позволяет сэкономить около 700 КБ памяти, что является значительным показателем в традиционных мобильных устройствах. Каждым контейнером растрового изображения можно управлять без изменения исходного экземпляра BitmapData с использованием свойств 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();
}
На следующем рисунке показан результат преобразований растрового изображения.