AS3的對象池

1. 爲什麼使用對象池

假設遊戲當中,玩家按下鼠標,那麼遊戲場景中出現一個美女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被訪到內存池中存儲起來重複利用了。

2. 對象池原理

對象池的工作原理的核心有兩點:使用和緩存,即對於那些被頻繁使用的對象,在使用完後,不立即將它們釋放,而是將它們緩存起來,以供後續的應用程序重複使用,從而減少創建對象和釋放對象的次數,進而改善應用程序的性能。

優點:能快速取出對象節省了NEW對象所產生的cpu,時間的消耗。能很好的控制內存的佔用,使用時從對象池取出,使用完畢放回。中間不涉及到對象銷燬創建,所以內存佔用是定量的。

要實現一個對象池,一般會涉及到以下的幾個類:

目標對象(SomeObject)類

     該類就是程序中頻繁使用的對象。

對象池(ObjectPool)類

    該類主要用於管理對象的借出和歸還,並通知對象池完成相應的工作。它至少包含兩個方法:

  borrowObject():用於從池中借出對象;

  returnObject():將對象歸還到池中;

代碼如下:

package wingox.pool {
    import flash.utils.Dictionary;

    /**
     * @version 20100315
     * @author BrightLi
     */
    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];
        }
    }
}


對象池如果用的不好可能會造成極大的內存問題,要視情況而定,只有經常用到的對象纔可以池化,如果在整個程序生命期中只用過一兩次的顯示對象一定不要池化否則相當於自己製造了AVM永遠不會GC的“垃圾”。
舉個例子:如登錄界面,這個只會用到一次的顯示對象,一定不要池化!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章