Повторное использование объектов

По возможности используйте объекты повторно вместо их повторного создания.

Другим простым способом оптимизации памяти является повторное использование объектов и по возможности предотвращение их повторного создания. Например, в цикле не используйте следующий код:

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

На следующем рисунке показан результат преобразований растрового изображения.

Полноразмерное изображение
Результат преобразований растрового изображения