ts版本的简易对象池 ,目前主要支持3D的物体,也可以将其改成其他类型

要使用首先调用InitPool 方法

`/*

使用说明: 使用必须先调用 InitPool 方法将对象池初始化

然后 DequeueItem 会根据对象池指定的编号 返回编号指定对象池中的一个物体,然后在外部进行信息设置

EnqueueItem 调用对象回池,根据指定编号放置到对应的对象池中

ClearPool 清理对象池,将指定对象池中的物体放到Laya默认的内存回收机制中,等待回收

备注:

使用时需将某一类对象池与该对象池对应的编号对应好,否则使用时会出问题

*/

export default class PoolManager {

static _instance:any;

private node:Laya.Node; //3D物体父节点

public m_ObjectPoolDic:{[key:number]: Laya.MeshSprite3D}={}

constructor() { this. node=new Laya.Node(); this. node.name="Node"; Laya.stage.addChild(this.node);}

static getInstance() {

return this._instance || (this._instance = new PoolManager() )

}

//初始化
//加载到内存中创建出来之后添加到这里面

public InitPool(key:number,MeshSprite: Laya.MeshSprite3D){

//初始化id对应对象池, 第一次初始化则必须保证池中最少存在1个

if (this.m_ObjectPoolDic[key]){

console.log("初始化有误,该值已经有对应的 对象池了");

}

else{

this.m_ObjectPoolDic[key]=(MeshSprite);

let childNode=new Laya.Node();

childNode.name=key.toString();

this.node.addChild(childNode)

}

}

//按照编号取出对应对象池中的一个物体
public DequeueItem(key:number): Laya.MeshSprite3D {
if(this.m_ObjectPoolDic[key])
{
let childNode=this.node.getChildByName(key.toString())
if(childNode.numChildren==0){
let tempobj= this.m_ObjectPoolDic[key].clone() as Laya.MeshSprite3D;;
tempobj.name=key.toString();
return tempobj;
}
else{
let tempobj=childNode.getChildAt(0)as Laya.MeshSprite3D; ;
tempobj.removeSelf();
return tempobj ;
}
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return null;
} } //对象回池,对象的状态信息,尽可能在回池前设置成默认状态
// 比如说物体上添加的一些脚本,可以在回池前去掉或者 后面再对脚本进行判断
//需要记住该物体对象池所对应的指定的编号,否则一旦添加错误,无法修改
public EnqueueItem(key:number,MeshSprite:Laya.MeshSprite3D):void{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let childNode=this.node.getChildByName(key.toString()) MeshSprite.active=false;
MeshSprite.removeSelf(); childNode.addChild(MeshSprite);
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return;
}
} //清理对象池 根据编号清理指定的对象池
public ClearPool(key:number):void{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let QueuePool=this.m_ObjectPoolDic[key];
this.m_ObjectPoolDic[key].destroy();
delete this.m_ObjectPoolDic[key]; let childNode=this.node.getChildByName(key.toString())
childNode.destroyChildren();
childNode.destroy();
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return ;
}
}
//获取对象池长度 根据编号获取指定的对象池的长度
public GetPoolLenght(key:number):number{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let childNode=this.node.getChildByName(key.toString())
return childNode.numChildren;
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return null;
}
}

}

使用方法:var Cube:Laya.MeshSprite3D=new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(1, 1, 1)) as Laya.MeshSprite3D;

PoolManager.getInstance().InitPool(1,Cube); //这一步必须进行

    for (let i=0 ;i<10;i++){
var CubeSwpan=scene.addChild( PoolManager.getInstance().DequeueItem(1)) as Laya.MeshSprite3D;
CubeSwpan.transform.localPosition=new Laya.Vector3 (-i+5,0,-i+5);
this. List[i]=CubeSwpan;
}
debugger; console.log(PoolManager.getInstance().GetPoolLenght(1));
for (let i=0 ;i<10;i++){
let Cube= this.List[i] as Laya.MeshSprite3D;
Cube.active=false;
PoolManager.getInstance().EnqueueItem(1,Cube);
}
debugger;
console.log(PoolManager.getInstance().GetPoolLenght(1));
}
List ={key:Laya.MeshSprite3D};`

Laya Ts 简易对象池的更多相关文章

  1. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

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

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

  3. Egret中的对象池ObjectPool

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

  4. 对象池化技术 org.apache.commons.pool

    恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...

  5. 简易高重用的jdbcutils工具封装实现类以及简易连接池实现

    因为如今发现做个小项目都是导入n多的依赖包,非常烦琐,仅仅想快点开发完一个个的小需求项目,这个时候真心不想用框架,仅仅能自己写个jdbcutils,尽管网上有非常多有apache的,阿里的,可是感觉用 ...

  6. Egret中的对象池Pool

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

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

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

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

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

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

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

随机推荐

  1. Spring framework核心

    这一部分涵盖了Spring框架绝对不可或缺的所有技术. 1.IOC容器 1.1Spring IoC容器和beans介绍 org.springframework.beans和org.springfram ...

  2. BJOI2015 隐身术

    落谷. Description 给你两个串 \(A.B\).询问 \(B\) 中有多少个非空子串和 \(A\) 的编辑距离不超过 \(K\). Solution 发现 \(K \le 5\),考虑可以 ...

  3. AGC043 B题题解

    有的时候,碰到一道题,要给自己先设立部分分,再去想如何把部分分推广到一般情况.这题就是绝佳的例子. 不妨将\(a_i\)用\(a_i - 1\)替代,这样就变成了\(a_i \in \{ 0, 1, ...

  4. Java8新增的这些集合骚操作,你掌握了嘛?

    目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...

  5. node目录

    1 [了解nodejs] 1.1 [node简介] 1.2 [node的特点] 1.3 [如何安装] 1.4 [如何运行] 2 [es6--基本语法] 2.1 [变量的解构赋值] 2.2 [解构赋值] ...

  6. SQL注入----盲注总结

    参考文章:https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247490388&idx=1&sn=c677837d7 ...

  7. BUUCTF 刮开有奖 WriteUp

    题目链接 https://buuoj.cn/challenges#%E5%88%AE%E5%BC%80%E6%9C%89%E5%A5%96 题解 用IDA打开,按F5反编译,双击进入DialogFun ...

  8. zabbix学习(一)——LNMP环境搭建及zabbix安装

    第一部分:LNMP环境搭建 一.环境说明: OS:   centos7.6_x64nginx:nginx-1.16.0php:   php-7.1.11mysql:mysql-5.6.44 zabbi ...

  9. windows 任何软件出现异常有日志 w3wp.exe [10608]中发生了未处理的Microsoft .Net Framework异常

    右键我的电脑 管理

  10. IIS添加应用程序和虚拟目录

    右键添加应用程序 别名就是虚拟路径 比如本来路径是http://localhost:44336/main.html    别名为  qwer  那么就可以访问http://localhost:4433 ...