`

as3对象池应用

阅读更多

 

为什么使用对象池?


    我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女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被访到内存池中存储起来重复利用了。


了解对象池


对象池的工作原理:


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


优点:能快速取出对象节省了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;
		}
	}
}
分享到:
评论

相关推荐

    对象缓存池AS3实现

    在ActionScript 3(AS3)中,由于其基于ECMAScript的特性,对象创建和销毁可能会导致一定的性能影响,因此对象池模式的应用尤为必要。 接下来,我们将探讨如何用AS3实现对象缓存池。首先,我们需要定义一个基类或...

    对象池优化

    在AS3这样的环境中,正确地应用对象池和工厂方法,能够显著改善程序性能,尤其在需要频繁创建和销毁对象的场景下。文件“com”可能是源代码的一部分,包含有关对象池实现的具体细节,进一步分析这些源码可以帮助我们...

    flash 3d 效果内附as3源码

    7. **优化技巧**:为了确保在Web上流畅运行,可能涉及到一些优化技术,比如批次渲染、对象池管理、内存管理和性能监控。 学习这些源码可以帮助开发者深入了解AS3的3D编程,提高他们的技能,并能应用于实际项目,...

    as3算法大全

    位运算可以提高计算速度,对象池则能减少频繁创建和销毁对象带来的开销。 八、网络通信算法 AS3中的Socket和URLLoader类支持网络通信。TCP和UDP协议、HTTP和FTP请求,以及JSON或XML数据交换都是页游网络通信的基础...

    as3游戏开发简单游戏框架

    10. **对象池**:对象池是一种优化技术,用于复用游戏对象,避免频繁创建和销毁对象带来的性能开销。 在学习这个“简单游戏框架”时,你可以通过分析源代码了解上述各个部分的实现方式,并尝试修改和扩展它以适应...

    23种设计模式实例及说明大全(as3语言描述)

    在AS3中,可以使用弱引用和池技术来实现。 8. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。AS3中的DisplayObjectContainer类可以添加多个子对象,实现装饰功能。 9. 外观模式(Facade):为子...

    Flash AS3 工具性能输出窗口

    7. **代码优化**:常见的优化策略包括使用位运算代替浮点计算、避免不必要的对象创建、使用共享对象池、以及利用DisplayObject的cacheAsBitmap属性提高渲染效率。 8. **性能分析工具**:除了内置的性能输出窗口,...

    as3实现纸的折叠效果

    6. **对象池和性能优化**:为了提高性能,可以考虑使用对象池来复用图形对象,避免频繁创建和销毁导致的内存开销。同时,通过合理地缓存和复用矩阵、图形数据,也能提升动画的流畅度。 7. **编程技巧**:最后,良好...

    as3 抽奖小程序(图片)

    AS3(ActionScript 3)是Adobe Flash Professional和Flex Builder等开发工具中使用的主要编程语言,用于创建交互式内容、游戏和应用程序。在这个特定的项目中,“as3 抽奖小程序(图片)”是一个基于AS3编写的抽奖...

    as3 资源加载管理

    对于大资源的缓存,你可能需要自定义解决方案,比如使用内存对象池或者将资源分解成更小的部分来加载和缓存。 在白鹭引擎中,`RES`模块提供了一个完整的资源管理解决方案,包括预加载、缓存、按需加载等功能。如果...

    AS3中的EVENT

    11. **事件池(Event Pool)**: 为了提高性能,AS3使用事件池来复用事件对象。当事件处理完成后,对象会被放回池中,而不是立即销毁。 12. **自定义事件**: 开发者可以创建自己的事件类,继承自`Event`,并添加额外的...

    flash塔防小游戏源码as3

    总的来说,AS3塔防小游戏源码的学习,不仅能够帮助我们理解游戏开发的基本流程,还能深入理解面向对象编程在实际项目中的应用。通过分析和研究源码,我们可以从中汲取经验,提升自己的编程技能,甚至开发出更具创新...

    AS3相关资料

    1. **对象池**:预先创建一组对象并存储在数组或集合中,当需要时从池中获取,而不是每次需要时都新建。这样可以减少频繁的内存分配和垃圾回收。 2. **精灵表**:将多个小图像合并到一张大图(精灵表)中,通过坐标...

    AS3加载外部资源(资源管理器)

    在ActionScript 3 (AS3)中,加载外部资源是创建动态、交互式内容的关键技能。资源管理器功能允许开发者高效地处理各种类型的媒体和数据,包括图片、SWF文件、声音、XML文档以及二进制文件。这些加载技术不仅提高了...

    基于as3.0小游戏

    10. **性能优化**:AS3.0小游戏需要考虑性能问题,例如减少不必要的计算、优化渲染过程、使用池技术管理对象等,以确保游戏在不同设备上流畅运行。 以上知识点是AS3.0小游戏开发的核心组成部分,通过学习和实践,...

    AS3.O笔试题 2011年珠海某著名游戏公司面试题 FLASH开发试题

    - 使用共享对象池减少内存开销。 - 使用Vector类代替Array,因为Vector是类型安全的,运行时性能更好。 - 缩减影片剪辑和显示对象的数量,合并图形。 - 利用事件监听器管理,避免内存泄漏。 - 优化网络请求,如...

    as3 烟花粒子测试

    6. **优化**:大量的粒子可能导致性能问题,通过使用对象池或者限制同时存在的粒子数量可以优化性能。 7. **动画帧率控制**:调整动画帧率来平衡视觉效果和性能。 8. **用户交互**:如果允许的话,可以添加用户...

    在Flex项目中引用Away3D(版本3.6)AS项目

    9. **性能优化**:由于3D渲染对计算资源的需求较高,因此理解内存管理、对象池和批处理技术对于优化Away3D应用至关重要。 10. **3DParking实例**:根据提供的文件名,3DParking可能是示例项目,演示如何在Flex中...

    AS3星云效果源码

    5. **性能优化**:由于粒子系统可能会生成大量对象,因此源码可能包含了性能优化策略,如对象池技术,减少频繁创建和销毁对象带来的内存开销,以及适当的缓存机制,提高渲染效率。 6. **编程结构**:良好的编程结构...

    flash as3.0射击小游戏

    7. **对象池**:为了优化性能,可能会使用对象池技术来复用游戏对象,如子弹和敌人,避免频繁创建和销毁对象。 8. **状态机**:游戏状态的管理可以使用状态机设计模式,如暂停、游戏结束、游戏进行等不同状态之间的...

Global site tag (gtag.js) - Google Analytics