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. 团队作业part6--复审与事后分析

    一.Alpha阶段项目复审:https://www.cnblogs.com/3Jax/p/13127401.html 二.事后诸葛亮分析:https://www.cnblogs.com/3Jax/p/ ...

  2. 谷歌SameSite策略

    当我新下载谷歌80.x版本的时候,访问一个系统(内嵌跳转到其他系统的iframe),跳转过去没有携带cookie,以前版本的谷歌浏览器是可以的,控制台提示SameSite策略,给阻止了cookie携带 ...

  3. jwt与springcloud联用

    图片来源与博客:https://www.jianshu.com/p/99a458c62aa4 分布式权限管理参考:https://blog.csdn.net/qq_36236890/article/d ...

  4. 5.深入Istio源码:Pilot-agent作用及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 介绍 Sidecar在注入的时候会 ...

  5. Shell变量、函数

    上篇文章初步认识了一下shell脚本及其简单的案例,下面我们再来讲一下shell的进击部分. 一.变量 1.常用系统变量:($HOME.$SHELL.$PWD.$USER) 2.自定义变量: 2.1. ...

  6. python 的基本语法

    python3 默认的编码格式 :utf-8 标识符: 1.可以是数字,字母,下划线组成 2.不能以数字开头 3.不能以保留字命名(保留字即是关键字,比如"print") 4.区分 ...

  7. 关于AES-CBC模式字节翻转攻击(python3)

    # coding:utf-8 from Crypto.Cipher import AES import base64 def encrypt(iv, plaintext): if len(plaint ...

  8. 分析《令人心动的offer2》网友们都在吐槽什么?

    综艺,是我们劳累了一天的放松方式,也是我们饭后的谈资.看着自己喜欢的综艺,时光足够美.而<令人心动的offer >,就是一个不错的综艺选择.有人说它让自己更自卑了,而我觉得挺有意思. &l ...

  9. Python 中日期函数

    导入日期库 datetime import datetime # 或者from datetime import datetime ,date 字符串转datetime

  10. 简单的冒泡排序算法(java)

    package lianxi; public class BubbleSort { public static void main(String[] args) { int[] array = {12 ...