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

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

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

参考资料,传送门: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. codeforces 680C C. Bear and Prime 100(数论)

    题目链接: C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input s ...

  2. 2013 长沙网络赛J题

    思路:这题对于其他能退出所有值的情况比较好像,唯一不能确定的是XXOXXOXXOXX这个形式的序列,其中XX表示未知,O表示已知. 我们令num[1]=0,那么num[4]=sum[3]-sum[2] ...

  3. String 和 StringBuffer的区别

    String与StringBuffer的区别:            简单地说,就是一个常量和变量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋 ...

  4. 《iOS开发指南》要改iOS8版本了,听听您的意见?

    <iOS开发指南>要改iOS8版本了,听听您的意见?参加问卷同学均可获得智捷课堂50元代金卡一张,同时抽取一名同学赠送即将出版的基于iOS8的<iOS开发指南>一本,欢迎大家填 ...

  5. 【学习笔记】虚拟机安装Mac系统

    参考了这篇装的虚拟机 http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html 系统的话可以到远景去找找 安装用工具: http:/ ...

  6. UI5_UIAlertView与UIActionSheet

    // // ViewController.h // UI5_UIAlertView与UIActionSheet // // Created by zhangxueming on 15/7/7. // ...

  7. Express中使用mongodb存储session

    express默认有队session的支持,但是是存储在内存中的. 我们可以使用mongodb来存储会话. 但是express的各个版本中对该功能的写法是不同的. Express 2.x: app.u ...

  8. JS学习第四课

    当我们删除某列表格,再添加新的一列时,它的序号该如何控制呢.这里id=oTab.tBodies[0].rows.length+1        otd.innerHTML=id++;   很关键哦. ...

  9. 【leetcode】15. 3Sum

    题目描述: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  10. 杭电ACM2084--数塔

    http://acm.hdu.edu.cn/showproblem.php?pid=2084 这种DP是相对容易的,一个二维数组,遍历一次,计算结果,存在指定位置. 本题关键代码是: a[i-1][j ...