Nesne kuyruğu

Mümkünse, nesne kuyruğu kullanın.

Başka bir önemli en iyileştirmeye nesne kuyruğu adı verilir, nesne kuyruğu zaman içinde nesnelerin yeniden kullanımını içerir. Uygulamanızın başlatılması sırasında tanımlı bir sayıda nesne oluşturup onları bir Array veya Vector nesnesi gibi bir kuyruk içerisinde saklayabilirsiniz. Bir nesne ile gerçekleştirdiğiniz işlem tamamlandığında, onu işlemci kaynaklarını tüketmemesi için devre dışı bırakabilirsiniz ve karşılıklı başvuruları kaldırırsınız. Ancak başvuruların null değerine ayarlanması bu öğeyi çöp toplama için uygun hale getireceğinden bu işlemi gerçekleştiremezsiniz. Basitçe nesneyi kuyruğa geri koyarsınız ve yeni bir nesneye ihtiyaç duyduğunuzda geri alırsınız.

Nesnelerin tekrar kullanılması, nesneleri örneklendirme ihtiyacını azaltır ve bu durum fazla çaba gerektirebilir. Bu ayrıca çöp toplayıcının uygulamanızı yavaşlatarak çalışma ihtimalini de düşürür. Aşağıdaki kod, nesne kuyruğu tekniğini gösterir:

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 sınıfı uygulamanın başlangıcında yeni nesnelerden oluşan bir kuyruk oluşturur. getSprite() yöntemi, bu nesnelerden örnekler döndürür ve disposeSprite() yöntemi onları bırakır. Kod, kuyruk tamamen kullanıldığında onun büyümesine olanak verir. Ayrıca, kuyruk yorulduğunda yeni nesnelerin ayrılmayacağı sabit boyutlu bir kuyruk oluşturmak da mümkündür. Mümkünse, döngüler halinde yeni nesneler oluşturmaktan kaçının. Daha fazla bilgi için, bkz. Belleği boşaltmak . Aşağıdaki kod yeni örnekler almak için SpritePool sınıfını kullanır:

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

Aşağıdaki kod fare tıklatıldığında tüm görüntüleme nesnelerini görüntüleme nesnesinden kaldırır ve daha sonra onları başka bir görev için yeniden kullanır.

stage.addEventListener ( MouseEvent.CLICK, removeDots ); 
  
function removeDots ( e:MouseEvent ):void 
{ 
    while (container.numChildren > 0 ) 
        SpritePool.disposeSprite (container.removeChildAt(0) as Sprite ); 
}
Not: Kuyruk vektörü her zaman Sprite nesnelerine başvurur. Nesneyi bellekten tamamen kaldırmak isterseniz, size SpritePool sınıfında, kalan tüm başvuruları kaldıracak bir dispose() yöntemi gerekir.