【h5-egret】深入浅出对象池
最近看到对象池这一块的东西,是频繁创建和删除类型游戏优化性能的一个解决方案。
简单来讲对象池就是个数组,把不用的对象放进去,因为数组还保存了对象的引用,所以对象不会被回收,等需要用的时候再从数组中取出来。
这类的游戏大概是打飞机这一类的游戏,频繁创建子弹,和删除子弹,敌机等。
参考资料,传送门:http://bbs.egret.com/thread-1017-1-1.html;http://bbs.egret.com/thread-256-1-1.html。
1.一个简单的对象池
好,让我们先对对象池来一个简单的理解。
// 回收不用的对象
public recycleObject(noUse:any):void
{
this._pool.push(noUse);
}
// 需要用这个对象的时候,先检索对象池有没有缓存对象,有的话取出来以后初始化属性,对象池是空的话再创建新对象 public getObject():any
{
if(this._pool.length)
return this._pool.shift();
else
return new egret.Bitmap(); //用bitmap作示例
}
需要创建对象的时候,调用getObject方法,不需要的对象实例通过recycleObject方法回收。
这就是一个简单的对象池。
2.来来来,看一段干货
// 声明一个存放对象池数组 的数组
private static cacheDict:Object = {}; // 创建对象,对象池有就拿出来初始化,没有就创建一个对象。(冒号后面是返回值,返回值的类型就是我们的缓存对象。)
public static produce(textureName:string):fighter.Airplane
{ // textureName 是缓存对象的标识,这样的写法的好处是可以缓存多种不同的对象,比如飞机有两种,“p1”,“p2”。
// 如果textureName对应的对象池为空的话,初始化一个对象池。
if(fighter.Airplane.cacheDict[textureName]==null){
fighter.Airplane.cacheDict[textureName] = [];
} //根据对象的标示textureName找到对象缓存池数组
var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName]; // 声明一个对象来接收需要返回出去的对象
var theFighter:fighter.Airplane; // 如果对象池有对象就把对象拿出来用,否则创建一个对象
if(dict.length>0) {
theFighter = dict.pop();
} else {
theFighter = new fighter.Airplane(RES.getRes(textureName));
}
// 返回对象
return theFighter;
} // 回收对象
public static reclaim(theFighter:fighter.Airplane,textureName:string):void
{ // 如果textureName对应的对象池为空的话,初始化一个对象池。
if(fighter.Airplane.cacheDict[textureName]==null){
fighter.Airplane.cacheDict[textureName] = [];
} // 根据对象的标示textureName找到对象缓存池数组
var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName]; // 如果对象池里面没有这个对象,那么缓存进对象池
if(dict.indexOf(theFighter)==-1){
dict.push(theFighter);
}
}
流程解析(比如打飞机的子弹):
1.创建:定时器创建子弹,创建1个,produce一次,创建第二个,继续produce一次,创建多少,produce多少次。因为还没有回收的对象,所以调用的都是theFighter = new fighter.Airplane(RES.getRes(textureName))这句,来新建对象;
2:回收:等到子弹碰到敌机或者飞出界面的时候,就可以reclaim了,回收对象,此刻对象池就有回收的对象了。一个,两个,回收多少,对象池就多少对象,回收的对象,都是一种对象。
3:回收之后创建:当定时器再创建子弹的时候,就直接去取对象池的对象,因为回收了对象,而且所有的对象都是一种,就直接pop或者shift推出来,然后对象池删除推出来使用的对象。
对象池就这么简单的搞定了。
MT.Team
【h5-egret】深入浅出对象池的更多相关文章
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- Egret中的对象池Pool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- 通用对象池ObjectPool的一种简易设计和实现方案
对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...
- paip.提升性能----数据库连接池以及线程池以及对象池
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax 艾龙, ...
- common-pool2对象池(连接池)的介绍及使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
随机推荐
- Mac和Linux下测试端口是否存活一法[转载]
测试端口存活的最常用的方法是telnet $telnet 127.0.0.1 80 不过这个方法有一个不方便的地方:连接成功后会进入交互模式,需要按 ctrl + ] 和 q 才能退出. 后来,经过网 ...
- Hibernate学习小结
之前从事.net开发的三年经验里,我是用过EF.Microsoft Dynamic crm中集成的ORM以及上一家公司自主开发的ORM. 再接触Hibernate后,上手比较简单,但其提供了大量的接口 ...
- 5059 一起去打CS
5059 一起去打CS 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 早就和lyk约好了去 ...
- MVC 页面跳转
想要学习MVC,那么页面跳转就是必不可少的,在此我总结了常见的页面跳转方式,给自己理一下做个备份,也顺便和大家分享一下. 常见页面跳转的:(下面的视图名和控制器中的方法名一样) 在控制器内部跳转: / ...
- cmd 命令收集
window类 1.命令打开系统设置页面 1.control keymgr.dll 打开凭据管理器 2.gpedit.msc 打开管理面板 3.mspaint--------画图板 4.msts ...
- Sql Server 数据库之间如何进行跨网远程连接访问
场景说明 现在有一台A电脑和一台B电脑,两台电脑都安装了Sql Server数据库,两台电脑不在一个局域网(我们考虑的是不同网络的两台数据库连接),比如A电脑在公司,B电脑在家里,现在我要在家里用B电 ...
- Javascript获取URL地址变量参数值的方法
今天碰到在做一个动态页面的时候,需要用到 URL 的参数值来作判断,从而决定某一块内容在当前页面是否显示.例如exampe.html?parm1=xxx&parm2=xxx&parm3 ...
- js 用window.open(参数) 打开新窗口,在新窗口怎么获取传过来的参数
unction openwin(taskno){window.open ('playIt.jsp?taskno='+taskno,'play','height=100,width=400,toolba ...
- 理解C#系列 / 核心C# / 编译参数
编译参数 编译控制台应用程序 csc 源文件.cs 编译Windows应用程序 csc /t:winexe 源文件.cs 编译类库应用程序 csc /t:libray 源文件.cs 编译引用类库的应用 ...
- eclipse优化(部分)
1. 增强Eclipse(MyEclipse)输入代码提示功能 一般设置: (1). 打开Eclipse,选择打开" Window -- Preferences". (2). 在目 ...