AS3的对象池
来源:互联网 发布:中诚信国际 知乎 编辑:程序博客网 时间:2024/06/05 01:52
1. 为什么使用对象池
假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女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被访到内存池中存储起来重复利用了。
2. 对象池原理
对象池的工作原理的核心有两点:使用和缓存,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。
优点:能快速取出对象节省了NEW对象所产生的cpu,时间的消耗。能很好的控制内存的占用,使用时从对象池取出,使用完毕放回。中间不涉及到对象销毁创建,所以内存占用是定量的。
要实现一个对象池,一般会涉及到以下的几个类:
目标对象(SomeObject)类
该类就是程序中频繁使用的对象。
对象池(ObjectPool)类
该类主要用于管理对象的借出和归还,并通知对象池完成相应的工作。它至少包含两个方法:
borrowObject():用于从池中借出对象;
returnObject():将对象归还到池中;
代码如下:
package wingox.pool { import flash.utils.Dictionary; /** * @version 20100315 * @author BrightLi */ public class ObjectPool { private static var _pool : Dictionary = new Dictionary(true); private var _template : Class; private var _list : Array; public function ObjectPool(value : Class) { _template = value; _list = new Array(); } public function borrowObject() : Object { if(_list.length > 0) { return _list.shift(); } return new _template(); } public function returnObject(value : Object) : void { _list.push(value); } public static function getPool(value : Class) : ObjectPool { if(!_pool[value]) { _pool[value] = new ObjectPool(value); } return _pool[value]; } }}
举个例子:如登录界面,这个只会用到一次的显示对象,一定不要池化!
- AS3的对象池
- AS3的对象池
- AS3中简单的一般对象池
- as3对象池
- as3对象池研究
- AS3 对象池类
- AS3对象池
- as3中对象的比较
- as3扫盲:对象池应用
- as3 对象和对应的事件
- as3中DisplayObject对象的rotation属性
- as3 各显示对象的层级关系
- AS3可视对象的水平翻转
- as3遍历对象所有属性的方法
- AS3中显示对象层级的控制
- as3中删除对象的方法
- AS3中不适合重用的对象
- AS3将XML转成对象的类
- USING INDUCTION TO DESIGN 使用归纳法设计算法 [6/14]
- 输入子系统--event层分析
- 《Android开发从零开始》——34.ListView控件学习
- C# 向Sql-server数据库保存图片
- SPI的模拟驱动
- AS3的对象池
- MFlood 路由协议(NS -2仿真)
- C语言程序的外部变量与函数
- SOCKET基本知识(1)
- windows7 与 VS2005兼容
- AcDbObjectId、AcDbHandle与AcDbStub之间的关系
- 讲解Informix Dynamic Server的权限设置
- 利用js实现跨域取数据问题
- 每日一句,每日10词【3】(13天)Perseverance is vital to success.