package {import flash.utils.Dictionary;import flash.utils.getDefinitionByName;import flash.utils.getQualifiedClassName;/*** 用於顯示對象的對象池類* @author yanghongbin**/public class DisplayObjectPool {private static var instance:DisplayObjectPool;/*** 作為對象池的詞典dict*/private var objPoolDict:Dictionary = new Dictionary();public function DisplayObjectPool() {}public static function getInstance():DisplayObjectPool {if (instance == null) {instance = new DisplayObjectPool();}return instance;}/*** 向對象池中放入對象,以便重複利用* @param disObj 要的放入對象**/public function push(oldObj:Object):void {var objName:String = getQualifiedClassName(oldObj);if (oldObj == null) {return ;}if (this.objPoolDict[objName] == null) {this.objPoolDict[objName] = [];}this.objPoolDict[objName].push(oldObj);}/*** 從對象池中取出需要的對象* @param targetObj 需要的對象類類名,沒必要必須是類執行個體名 類名就可以* @return 取出的相應對象**/public function pop(targetObj:Object):Object {var objName:String = getQualifiedClassName(targetObj);trace(objName);if (this.objPoolDict[objName] != null && this.objPoolDict[objName].length > 0) {return this.objPoolDict[objName].pop()as Object;}var objClass:Class = getDefinitionByName(objName)as Class;var obj:Object = new objClass as Object;return obj;}}}
| 來自:★大笨熊之家★ 在as3遊戲開發中,記憶體問題基本是開發人員最為頭疼的了,官方也沒具體的記憶體最佳化指導,開發人員只能自己摸索著。顯示列表的層級removechild、事件監聽的及時移除或者弱引用。這些都是對於記憶體問題要注意的,因為AS3的記憶體回收機制並不是那麼‘勤勞’的,記憶體回收只會在特定的時刻,或者是記憶體達到一定的瓶頸時才會進行。所以開發人員要特別注意開發細節上的處理來節省記憶體。對象池是一個很好的方法。 比如在製作子彈射擊的時候,子彈每次都被new出來。這樣肯定很消耗記憶體。如果子彈new出來後螢幕上不需要這顆子彈了。可以將其放入對象池中。再次new的時候可以重複利用。 我寫了一個對象池的類。這個類是單例的。用的是dictionary集合來進行的儲存物件。KEY就是對象的包名+類名,所對應的是一個array數組。裡面存放著可重複利用的對象 用 一個push方法來放入對象 用一個 pop方法來取出需要的對象。 |