對象池

爲什麼使用對象池?
  ok,我們先來看一個例子:假設遊戲當中,玩家按下鼠標,那麼遊戲場景中出現一個美女A,代碼是var A:美女A=new 美女A();addChild(A);  放開鼠標美女被清除,代碼是:A.dispose();A=null;如果某個玩家不停地點擊鼠標,那麼我們的代碼將不停的NEW 美女A()而NEW 美女A()其實是很費時消耗系統性能這是問題就來了,假設NEW 美女A()消耗了2KB內存,玩家瘋狂點一千次,那麼我們的美女類就不斷地創建,清除,創建,清除,那麼我們的遊戲內存直接增加1000*2kb,因爲FLASH是託管的GC清理資源,具體什麼時候清理只有GC知道,那麼我們的遊戲的性能就.........可是如果我們有了對象池那又是一種什麼情況呢?首先美女將被new 美女A() 然後美女A被放入到對象池中存放,當鼠標按下的時候我們將執行:ObjectPool. borrowObject():取得美女A,當鼠標按下我們執行ObjectPool.returnObject():這樣子美女又被放入到對象池中存起來了,執行一千次,由於使用對象池取得美女A和放入美女A中不涉及到對象的創建和銷燬,所以我們的遊戲不會導致系統資源的增加。因爲美女A被訪到內存池中存儲起來重複利用了。
 
瞭解對象池
對象池的工作原理:
    對象池的工作原理的核心有兩點:使用和緩存,即對於那些被頻繁使用的對象,在使用完後,不立即將它們釋放,而是將它們緩存起來,以供後續的應用程序重複使用,從而減少創建對象和釋放對象的次數,進而改善應用程序的性能。
優點:能快速取出對象節省了NEW對象所產生的cpu,時間的消耗。能很好的控制內存的佔用,使用時從對象池取出,使用完畢放回。中間不涉及到對象銷燬創建,所以內存佔用是定量的。同時如果對象池提前
缺點:對象池同樣消耗new同樣對象所消耗的時間,對象池從創建到結束消耗定量的內存。對象池只適合大量的對象需要被重複創建使用銷燬創建使用銷燬的情況。非提前初始化式內存池,緩存as值類型的對象如:Point反而產生更大的消耗。
 
 要實現一個對象池,一般會涉及到以下的幾個類:
 目標對象(SomeObject)類
     該類就是程序中頻繁使用的對象。
 對象池(ObjectPool)類
    該類主要用於管理對象的借出和歸還,並通知對象池完成相應的工作。它至少包含兩個方法:
  borrowObject():用於從池中借出對象;
  returnObject():將對象歸還到池中;
 
下面獻上雲開老大的代碼:
package wingox.pool {           
 import flash.utils.Dictionary;           
public class ObjectPool {                     
private static var _pool : Dictionary = new Dictionary(true);                    
private var _template : Class;                    
private var _list : Array;   
                 
public function ObjectPool(value : Class) {                            
      _template = value;                            
      _list = new Array();                    
                   
public function borrowObject() : Object {
         if(_list.length > 0) {
              return _list.shift();                       
         }                           
         return new _template();                    
}                    
 
public function returnObject(value : Object) : void {                            
        _list.push(value);                    
}                    
 
public static function getPool(value : Class) : ObjectPool {                            
     if(!_pool[value]) {                                    
           _pool[value] = new ObjectPool(value);                            
     }                            
     return _pool[value];                    
           
}    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章