ActionScript3对象池扫盲

相关文章:http://greenexe.iteye.com/blog/908202

               http://www.mysjtu.com/page/M0/S675/675856.html

              

 

我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女A,代码是:
                         var girl:Girl=new Girl();
                                     addChild(girl); 
放开鼠标美女被清除,代码是:
                         girl.dispose();
                                      girl=null;
如果某个玩家不停地点击鼠标,那么我们的代码将不停的new Girl()。而new Girl()其实是很费时、消耗系统性能。假设new Girl()一次消耗2KB内存,如果某狂人疯狂点一千次,那么我们的Girl类就不断地创建,清除,创建,清除,那么我们的游戏内存直接增加1000*2kb,因为 FLASH是托管的GC清理资源,具体什么时候清理只有GC知道,那么我们的游戏的性能就………可是如果我们有了对象池那又是一种什么情况呢?首先Girl将被new Girl() ,然后girl被放入到对象池中存放,当鼠标按下的时候我们将执行:ObjectPool. borrowObject():取得girl,当鼠标按下我们执行 ObjectPool.returnObject():这样子girl又被放入到对象池中存起来了,执行一千次,由于使用对象池取得girl和放入girl中不涉及到对象的创建和销毁,所以我们的游戏不会导致系统资源的增加。因为girl被访到内存池中存储起来重复利用了。

摘自Adobe的一段

http://help.adobe.com/zh_CN/as3/mobile/WS948100b6829bd5a6-19cd3c2412513c24bce-8000.html

请尽可能使用对象池。
另一个重要优化称为对象池,涉及到不断重复使用对象。在初始化应用程序期间创建一定数量的对象并将其存储在一个池中,

例如 Array 或 Vector 对象。对一个对象完成操作后,停用该对象以免它占用 CPU 资源,然后删除所有相互引用。然而,

不要将引用设置为 null,这将使它符合垃圾回收条件。只需将该对象放回到池中,在需要新对象时可以对其进行检索。

重用对象可减少实例化对象的需求,而实例化对象成本很高。还可以减少垃圾回收器运行的机会,从而提高应用程序运行速度。

使用了对象池后

我们会首先创建出需要的实例,并且把它扔进对象池objectPool


对象池应该是靠单例获取
开始时:初始化的时候直接给池子一定量的对象
使用时:从objectPool里borrow一个
销毁时(释放):return它到objectPool中去

完全释放:池矢量始终引用 Sprite 对象。如果要从内存中完全删除对象,需要对 SpritePool 类使用 dispose() 方法,从而删除所有剩余引用。


了解对象池

对象池的工作原理:


    对象池的工作原理的核心有两点:使用和缓存,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使 用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。

优点:能快速取出对象节省了NEW对象所产生的cpu,时间的消耗。能很好的控制内存的占用,使用时从对象池取出,使用完毕放回。中间不涉及到对象 销毁创建,所以内存占用是定量的。同时如果对象池提前

缺点:对象池同样消耗new同样对象所消耗的时间,对象池从创建到结束消耗定量的内存。对象池只适合大量的对象需要被重复创建使用销毁创建使用销毁 的情况。非提前初始化式内存池,缓存as值类型的对象如:Point反而产生更大的消耗。

 

package 
{
        import flash.utils.Dictionary;
        import flash.utils.getDefinitionByName;
        import flash.utils.getQualifiedClassName;
        /** 
         * 用于显示对象的对象池类  
         */
        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;
                        
                }
                
        }
        
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值