`
hacker47
  • 浏览: 340758 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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;
                        
                }
                
        }
        
}

 

分享到:
评论

相关推荐

    actionscript3

    第二部分:ActionScript 3 面向对象编程;第三部分:ActionScript 3 核心类;第四部分:ActionScript 3主要的Flash Player API;第五部分:ActionScript 3 视觉编程。以ActionScript 3 语言设计的本意和思路,浅深...

    ActionScript3中文手册

    ActionScript3是Adobe Flash平台的核心编程语言,用于创建交互式内容、富互联网应用程序(RIA)以及游戏。这个“ActionScript3中文手册”是为开发者提供的一份详细文档,旨在帮助他们理解和掌握ActionScript3的基本...

    Flash ActionScript 3殿堂之路

    《Flash ActionScript3殿堂之路》共分5个部分。第1部分:ActionScript 3语言基础;第2部分:ActionScript 3面向对象编程;第3部分:ActionScript 3 核心类;第4部分:ActionScript 3主要的Flash Player API;第5部分...

    actionscript 3 as3 pdf

    ActionScript 3.0 是一种强大的面向对象编程语言,它标志着 Flash Player Runtime 演化过程中的一个重要阶段。设计 ActionScript 3.0 的意图是创建一种适合快速地构建效果丰富的互联网应用程序的语言,这种应用程序...

    ActionScript3中文教程

    ActionScript3(简称AS3)是Adobe Flash Platform的主要编程语言,用于创建互动式富媒体内容、游戏以及应用程序。本教程是面向中文用户的专业ActionScript3教程,旨在帮助开发者利用Adobe Flash CS3专业软件进行高效...

    ActionScript 3 类型转换

    在深入探讨ActionScript 3类型转换的精妙之前,我们先来回顾一下ActionScript脚本语言,这是一种广泛应用于Adobe Flash平台的编程语言,主要用于创建动态交互式内容、游戏以及动画等。随着版本的演进,ActionScript...

    超级玛丽actionscript3游戏源码

    《超级玛丽ActionScript3游戏源码解析》 在IT领域,尤其是游戏开发中,源码是一种宝贵的教育资源。本文将深入探讨“超级玛丽”这一经典游戏的ActionScript3版本源码,帮助开发者理解游戏编程的基本原理和技术细节。...

    ActionScript 3 For Adobe Flash CS4 Professional

    ActionScript 3是Adobe Flash平台的一种面向对象的脚本语言,主要用于开发Flash和Flex应用程序。随着Flash CS4 Professional的推出,许多设计师和开发者需要从ActionScript 2迁移到ActionScript 3。本指南为设计师和...

    ActionScript 3设计模式(扫描版)

    此外,事件驱动编程是ActionScript 3的一个重要特性,而观察者模式正好适用于这种场景,可以有效地管理对象间的通信和事件响应。 ### 实践中的应用 在实际开发过程中,熟练掌握设计模式的应用对于编写高质量的...

    ActionScript3入门到精通学习教程pdf

    ActionScript3(简称AS3)是一种面向对象的编程语言,用于创建动态内容,特别是网页动画和互动应用。它是ActionScript2的后续版本,引入了许多改进和新特性,包括更强大的类型系统、更好的性能和增强的API。AS3的...

    ActionScript3编程游戏教程

    - **类与对象**:ActionScript3支持面向对象编程(OOP),通过类来定义对象的属性和方法,并利用继承和多态等特性来提高代码的灵活性。 #### 三、基本游戏开发技术 - **Sprite类详解**:Sprite类是ActionScript3中最...

    ActionScript3代码规范

    ActionScript3是一种面向对象的编程语言,主要用于开发Adobe Flash平台上的交互式内容。遵循良好的代码规范对于编写可读性高、易于维护的代码至关重要。以下是一些ActionScript3代码规范的关键点: 1. **命名规则**...

    actionScript 3 API

    ActionScript 3 (AS3) 是一种面向对象的编程语言,主要用于开发Adobe Flash平台上的交互式内容,如网页游戏、应用程序和动画。AS3 API 是一套接口和类库,为开发者提供了丰富的功能来构建这些应用。这篇文档将深入...

    flash actionscript3 纯AS3代码_资源加载进度条.rar

    在Flash开发中,ActionScript3(AS3)是用于创建交互式内容、游戏以及富互联网应用程序(RIA)的关键编程语言。本资源“flash actionscript3 纯AS3代码_资源加载进度条.rar”显然是一个关于如何使用AS3实现资源加载...

    ActionScript3的中文api和ppt讲解

    ActionScript3相较于其前代ActionScript2有了显著的提升,包括类型系统、性能优化和面向对象编程的支持。它引入了强类型系统,意味着变量在声明时必须指定数据类型,这有助于减少运行时错误。ActionScript3还支持类...

    Flash.ActionScript3.殿堂之路

    ★国内第一本“面向原因式”(Why-Oriented Book)与国际同步的、... ActionScript 3语言基础,ActionScript 3面向对象编程,ActionScript 3核心类,ActionScript 3主要的Flash Player API,ActionScript 3视觉编程。

    Flash ActionScript 3 殿堂之路 笔记

    在深入探讨Flash ActionScript 3 (AS3) 的殿堂之路之前,我们首先需要理解AS3中的数据类型和变量声明的基本概念。AS3是一门面向对象的编程语言,它的一个核心特性是“一切都是对象”(Everything is an Object)。这...

    ActionScript3教程

    ActionScript3(AS3)是Adobe Flash平台的核心编程语言,用于创建交互式内容、富互联网应用程序(RIA)以及游戏。这个教程将带你深入理解和掌握AS3的基础和高级特性。 首先,我们关注“ActionScript3教程”这个部分...

    Flash.ActionScript3殿堂之路完整版

    这表明内容将包括ActionScript3的基础语法、面向对象编程概念、事件处理、显示列表管理、网络通信、音频和视频处理、以及可能的游戏开发和高级动画制作等主题。 在基础部分,读者将学习如何在AS3中声明变量、函数和...

    ActionScript3小游戏-贪吃蛇

    1. **对象和类**:ActionScript3采用面向对象编程,游戏中的每个元素如蛇、食物、边界等都可以看作是不同的类。这些类定义了各自的属性(如位置、大小、速度)和方法(如移动、碰撞检测)。 2. **事件驱动编程**:...

Global site tag (gtag.js) - Google Analytics