[LayaAirIDE 2.0]Ts简单对象池

写了一份Ts版的简单 的对象池
 
详细信息放在博客里面了  需要的可以去看一下  https://nuolo.baklib.com/
 
 
/*
使用说明: 使用必须先调用 InitPool 方法将对象池初始化
然后 DequeueItem 会根据对象池指定的编号 返回编号指定对象池中的一个物体,然后在外部进行信息设置
EnqueueItem 调用对象回池,根据指定编号放置到对应的对象池中
ClearPool 清理对象池,将指定对象池中的物体放到Laya默认的内存回收机制中,等待回收
备注:
使用时需将某一类对象池与该对象池对应的编号对应好,否则使用时会出问题
*/
 
export default class PoolManager {
static _instance:any;
public m_ObjectPoolDic:{[key:number]:QueueT<Laya.MeshSprite3D>}={}
constructor() { }
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]=new QueueT<Laya.MeshSprite3D>();
this.m_ObjectPoolDic[key].push(MeshSprite);
}

//按照编号取出对应对象池中的一个物体
public DequeueItem(key:number):Laya.MeshSprite3D { 
 
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let QueuePool=this.m_ObjectPoolDic[key];
if(QueuePool.GetLenght()==0){
console.log("取出出错! 该对象池中物体已经全部取出,请检查");
return null;
}else if(QueuePool.GetLenght()==1){
let tempObj= QueuePool.pop();
let tempObjCopy= tempObj.clone() as Laya.MeshSprite3D;
QueuePool.push(tempObj);
return tempObjCopy;
}else if(QueuePool.GetLenght()>1){
let tempObj= QueuePool.pop();
return tempObj;

}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return null;


//对象回池,对象的状态信息,尽可能在回池前设置成默认状态
//需要记住该物体对象池所对应的指定的编号,否则一旦添加错误,无法修改
public EnqueueItem(key:number,MeshSprite:Laya.MeshSprite3D):void{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
this.m_ObjectPoolDic[key].push(MeshSprite);
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return;
}

//清理对象池 根据编号清理指定的对象池
public ClearPool(key:number):void{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let QueuePool=this.m_ObjectPoolDic[key];
QueuePool.Dispose();
this.m_ObjectPoolDic[key]=null;
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return ;

}
//获取对象池长度 根据编号获取指定的对象池的长度
public GetPoolLenght(key:number):number{
if(this.m_ObjectPoolDic[key])
{
//对象池中存在该 key 对应的池
let QueuePool=this.m_ObjectPoolDic[key];
return QueuePool.GetLenght();
}else
{
//对象池中不存在该 key 对应的池
console.log("获取对象错误,没有 该值所对应的对象池");
return null;
}
}

/**
* pop的返回值当data为空时返回undefined
* 使用了泛型约束
*/
class QueueT<T> {
constructor() {
this.data=new Array<T>();
}
    private data: Array<T>;
    push = (item: T) => this.data.push(item);
pop = (): T | undefined => this.data.shift();
GetLenght=():number=>{return this.data.length;}
Dispose=()=>{
for(let i in this.data){
Laya.Pool.recover("Dispose",this.data[i]);
}
}
}
 
已邀请:

要回复问题请先

商务合作
商务合作