最近看到对象池这一块的东西,是频繁创建删除类型游戏优化性能的一个解决方案。

简单来讲对象池就是个数组,把不用的对象放进去,因为数组还保存了对象的引用,所以对象不会被回收,等需要用的时候再从数组中取出来。

这类的游戏大概是打飞机这一类的游戏,频繁创建子弹,和删除子弹,敌机等。

参考资料,传送门: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】深入浅出对象池的更多相关文章

  1. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  2. Egret中的对象池Pool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...

  3. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  4. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  5. 通用对象池ObjectPool的一种简易设计和实现方案

    对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...

  6. paip.提升性能----数据库连接池以及线程池以及对象池

    paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax  艾龙, ...

  7. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

  8. javascript设计模式学习之四——单例模式,缓存与对象池

    单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...

  9. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

随机推荐

  1. 剑指Offer45 约瑟夫环

    /************************************************************************* > File Name: 45_LastNu ...

  2. # 基于Gitolite搭建Git Server - 支持SSH&HTTP

    Git, 一个分布式的版本管理工具,我认为其革命性的点:在于改变了用户协作的方式,使得协作更简单. 下面讲述 使用一个开源软件 Gitolite搭建一个Git Sever, 并给了一个推荐的团队协助方 ...

  3. [转载]JSON序列化与反序列化

    转载:http://www.cnblogs.com/ejiyuan/archive/2010/04/09/1708084.html 方法一:引入System.Web.Script.Serializat ...

  4. C#通用类型转换 Convert.ChangeType 转自网络

    static public object ChangeType(object value, Type type) { if (value == null && type.IsGener ...

  5. js对象,原型,call,apply浅析

    //对象直接量,创建对象最简单的方式是在js里使用对象直接量 var book = { "main title": "js", //属性里有空格,要用引号 &q ...

  6. WIN7实用的运行命令

    运行命令主要是DOS操作系统的运行方式.为方便用户的操作,微软公司将一些常用的命令,如DIR,CD等命令全部集成在系统里面:存放这些内部命令的文件是“Command”(文件后缀.com).它与IO.s ...

  7. [转]基于SQL脚本将数据库表及字段提取为C#中的类

    开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼.所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个 ...

  8. JQuery自定义属性的设置和获取

    Jquery操作自定义属性的方法,很简洁: $("#test").attr("test","aaa") // 设置 $("#tes ...

  9. 9 款赏心悦目的 HTML5/CSS3 特效

    1.HTML5 WebGL实验,超酷的HTML5 Canvas波浪墙 这是一款HTML5 Canvas实验项目,也是波浪特效,只是这不是真正的水波,而是利用柱体高度的变化实现的波浪墙效果. 在线演示 ...

  10. 状态模式(State)

    状态模式,从字面意思上来讲应该是很简单的,就是针对实际业务上的内容,当类的内部的状态发生改变时,给出不同的响应体,就像现实中的人一样,早上没有吃饭,状态不好,上班.上课都会打哈欠,中午了,吃过午饭,又 ...