Egret中的对象池Pool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理。
/**
* 对象池
* @author chenkai 2019.10.25
*/
class Pool {
private static poolMap = {}; /**
* 根据签名获取对象
* @param sign 签名
* @param clz 类名,对象池空,则根据类名创建新对象
*/
public static getItemBySign(sign:string,clz:any){
let pool = (this.poolMap[sign] || (this.poolMap[sign] = []));
if (pool.length) {
return pool.pop();
}
let obj: any = new clz();
obj.poolKey = sign;
return obj;
} /**
* 获取对象
* @param clz 对象类名
* @param args
*/
public static getItemByClass(clz: any) {
let clzName = clz.prototype["__class__"];
return this.getItemBySign(clzName, clz);
} /**
* 根据签名回收对象
* @param sign 签名
* @param ins 对象实例
*/
public static recoverBySign(sign:string, ins:any){
this.poolMap[sign] && this.poolMap[sign].push(ins);
} /**
* 回收对象
* @param ins 对象实例
*/
public static recoverByIns(ins: any) {
this.recoverBySign(ins.poolKey, ins);
} /**
* 根据签名清理对象
* @param sign 签名
*/
public static clearBySign(sign:string){
let pool = this.poolMap[sign];
if(pool){
let len = pool.length;
for(let i=0;i<len;i++){
pool[i].destroy && pool[i].destroy();
}
pool.length = 0;
delete this.poolMap[sign];
}
} /**
* 清理对象。对象会执行destroy。
* @param clz 对象类名
*/
public static clearByClass(clz: any) {
let clzName = clz.prototype["__class__"];
this.clearBySign(clzName);
} /**清理所有对象 */
public static clearAll(){
for(let key in this.poolMap){
this.clearBySign(key);
}
} }
//获取一个Ball
let ball:Ball = Pool.getItemByClass(Ball); //回收一个Ball
Pool.recoverByIns(ball);
以下是Laya的对象池源码,可以参考学习下
/**
*<p> <code>Pool</code> 是对象池类,用于对象的存贮、重复使用。</p>
*<p>合理使用对象池,可以有效减少对象创建的开销,避免频繁的垃圾回收,从而优化游戏流畅度。</p>
*/
//class laya.utils.Pool
var Pool=(function(){
function Pool(){}
__class(Pool,'laya.utils.Pool');
Pool.getPoolBySign=function(sign){
return Pool._poolDic[sign] || (Pool._poolDic[sign]=[]);
} Pool.clearBySign=function(sign){
if (Pool._poolDic[sign])Pool._poolDic[sign].length=0;
} Pool.recover=function(sign,item){
if (item["__InPool"])return;
item["__InPool"]=true;
Pool.getPoolBySign(sign).push(item);
} Pool.getItemByClass=function(sign,cls){
var pool=Pool.getPoolBySign(sign);
var rst=pool.length ? pool.pop():new cls();
rst["__InPool"]=false;
return rst;
} Pool.getItemByCreateFun=function(sign,createFun){
var pool=Pool.getPoolBySign(sign);
var rst=pool.length ? pool.pop():createFun();
rst["__InPool"]=false;
return rst;
} Pool.getItem=function(sign){
var pool=Pool.getPoolBySign(sign);
var rst=pool.length ? pool.pop():null;
if (rst){
rst["__InPool"]=false;
}
return rst;
} Pool._poolDic={};
Pool.InPoolSign="__InPool";
return Pool;
})()
Egret中的对象池Pool的更多相关文章
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- Unity编程标准导引-3.4 Unity中的对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...
- Java 中的对象池实现
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- .net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...
- GameObjectPool——Unity中的对象池
这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Co ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- Unity中的万能对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...
随机推荐
- Java【基础学习】 之调用构造方法顺序【坑】
解释:这里的super()仅仅是用来占位的,实际上,必须是严格按照分层初始化的过程:1.先初始化父类X的成员变量,即初始化成员变量Y,打印出:Y2.初始化父类X的构造方法,打印出:X3.父类初始化完成 ...
- MongoDB dataSize如何比storageSize更大?
原文 https://stackoverflow.com/questions/34054780/how-can-mongodb-datasize-be-larger-than-storages ...
- Spark-Hadoop、Hive、Spark 之间是什么关系?
作者:Xiaoyu Ma链接:https://www.zhihu.com/question/27974418/answer/38965760来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- go error=216编译错误
CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容.请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序, ...
- P1108 低价购买——最长下降子序列+方案数
P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ...
- 安装 sqoop
简介 Sqoop是一个用来将Hadoop(Hive.HBase)和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL ,Oracle ,Postgres等)中的数据导入到Ha ...
- pipres生成当前项目所有的依赖文件
对于使用虚拟环境的Python程序,直接pip freeze即可.但是对于没有使用虚拟环境,再使用pip freeze就不行了,因为它会把系统所有的包都导出. 所以使用第三方库pipreqs 安装 p ...
- Java中对象并不是都在堆上分配内存的
转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...
- 在Ubuntu下安装VWMare tools
之前随便解压在一个目录下一直不能安装,后来把压缩包解压到home目录下就可以了. 详细步骤:https://jingyan.baidu.com/article/597a0643356fdc312b52 ...
- 第10组 Alpha冲刺(3/6)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 对推送模块进行详细划分 基于用户的协同过滤,寻找更感兴趣的话题 学习API文档 ...