Создание пула объектов

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

Другой важный прием по оптимизации называется созданием пула объектов и включает повторное использование объектов со временем. При инициализации приложения создается заданное число объектов, которые сохраняются в пуле, таких как Array или Vector. По завершении работы с объектом он деактивируется и не использует ресурсы центрального процессора, а все взаимные ссылки удаляются. Однако не следует задавать этим ссылкам значение null , поскольку в этом случае они могут быть удалены при сборке мусора. Следует просто поместить объект обратно в пул и извлечь его, когда потребуется новый объект.

При повторном использовании объектов их не требуется создавать заново, поэтому ресурсы экономятся. Оно также уменьшает вероятность запуска функции сборки мусора, которая может замедлять работу приложения. Следующий код демонстрирует метод создания пула объектов.

package 
{ 
    import flash.display.Sprite; 
     
    public final class SpritePool 
    { 
        private static var MAX_VALUE:uint; 
        private static var GROWTH_VALUE:uint; 
        private static var counter:uint; 
        private static var pool:Vector.<Sprite>; 
        private static var currentSprite:Sprite; 
  
        public static function initialize( maxPoolSize:uint, growthValue:uint ):void 
        { 
            MAX_VALUE = maxPoolSize; 
            GROWTH_VALUE = growthValue; 
            counter = maxPoolSize; 
             
            var i:uint = maxPoolSize; 
             
            pool = new Vector.<Sprite>(MAX_VALUE); 
            while( --i > -1 ) 
                pool[i] = new Sprite(); 
        } 
         
        public static function getSprite():Sprite 
        { 
            if ( counter > 0 ) 
                return currentSprite = pool[--counter]; 
                 
            var i:uint = GROWTH_VALUE; 
            while( --i > -1 ) 
                    pool.unshift ( new Sprite() ); 
            counter = GROWTH_VALUE; 
            return getSprite(); 
             
        } 
  
        public static function disposeSprite(disposedSprite:Sprite):void 
        { 
            pool[counter++] = disposedSprite; 
        } 
    } 
}

Класс SpritePool создает пул новых объектов при инициализации приложения. Метод getSprite() возвращает экземпляры этих объектов, а метод disposeSprite() освобождает их. Код обеспечивает увеличение пула при его полном заполнении. Кроме того, можно создать пул фиксированного размера. В результате при полном заполнении пула новые объекты выделяться не будут. По возможности избегайте создания новых объектов в циклах. Дополнительные сведения см. в разделе « Освобождение памяти ». В следующем примере кода класс SpritePool используется для извлечения новых экземпляров.

const MAX_SPRITES:uint = 100; 
const GROWTH_VALUE:uint = MAX_SPRITES >> 1; 
const MAX_NUM:uint = 10; 
  
SpritePool.initialize ( MAX_SPRITES,  GROWTH_VALUE ); 
  
var currentSprite:Sprite; 
var container:Sprite = SpritePool.getSprite(); 
  
addChild ( container ); 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    for ( var j:int = 0; j< MAX_NUM; j++ ) 
    { 
        currentSprite = SpritePool.getSprite(); 
        currentSprite.graphics.beginFill ( 0x990000 ); 
        currentSprite.graphics.drawCircle ( 10, 10, 10 ); 
        currentSprite.x = j * (currentSprite.width + 5); 
        currentSprite.y = i * (currentSprite.width + 5); 
        container.addChild ( currentSprite ); 
    } 
}

В следующем примере кода все экранные объекты удаляются из списка отображения при щелчке мышью, а затем повторно используются для выполнения другой задачи.

stage.addEventListener ( MouseEvent.CLICK, removeDots ); 
  
function removeDots ( e:MouseEvent ):void 
{ 
    while (container.numChildren > 0 ) 
        SpritePool.disposeSprite (container.removeChildAt(0) as Sprite ); 
}
Примечание. Вектор пула всегда ссылается на объекты Sprite. Если необходимо полностью удалить объект из памяти, воспользуйтесь методом dispose() класса SpritePool, который удаляет все остальные ссылки.