使用對象池優化代碼的一種技巧

對象池可以用於優化代碼,提高代碼效率。

這裏我提供了一種簡單的技巧。

查閱一下代碼,把函數內的、函數開頭的所有定義引用變量+new對象的代碼找到,然後從對象池中pop出來,再在函數結尾中把對象再push進去。

如果是隻有函數內的一段代碼用到,比如一個循環裏邊的變量,那就可以在循環裏邊用這個,在結尾處把對象push進去。

把代碼中修改的所有的new對象,都在對象池的構造器中直接new一遍然後放入對象池中。其實這件事情不做也可以。

以下貼上一個網上找的AS3的對象池(http://www.cnblogs.com/AS30/archive/2011/09/28/2194611.html):

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;

        }

    }

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