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];
}
}
}
舉個例子:如登錄界面,這個只會用到一次的顯示對象,一定不要池化!