当前位置:首页 > 开发 > Web前端 > 前端 > 正文

as3对象池应用

发表于: 2012-08-10   作者:elviszhao   来源:转载   浏览次数:
摘要:   为什么使用对象池?     我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女A,代码是var A:美女A=new 美女A();addChild(A);  放开鼠标美女被清除,代码是:A.dispose();A=null;如果某个玩家不停地点击鼠标,那么我们的代码将不停的NEW 美女A()而NEW 美女A()其实是很费时消

 

为什么使用对象池?


    我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女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对象池应用

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
DisplayObject 类是可放在显示列表中的所有对象的基类。也就是可以显示在swf舞台上面的可视对象都是
问题描述:在实现对象池的时候都会面对一个回收的问题,大部分实现都是将回收的主动权交给了使用方
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
Jakarta对象池 ☆为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
早在2008年三年就发布了一个对象池工具类,允许你在集合中放置对象,在需要时再用,众所周知Flex的
1、对象池技术并没有限制说只能创建一个对象,而且这种技术同样适用于创建固定数量的对象,然而,这
Jakarta对象池 ☆为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消
1.了解 TaskExecutor接口 Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 实
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号