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. Typora入门教程

    Typora学习教程 1目录 [TOC]加空格 ,自动生成 目录 1目录 2图片 3下划线 4删除线 5解决语法和内容冲突 6加粗 6.1测试页面跳转 7倾斜 8超链接 9模块 10引用 11表格 1 ...

  2. 【eJOI2020】考试(dp & 树状数组优化)

    Description \(n\) 个正整数排成一列,每个位置 \(i\) 有一个初始值 \(A_i\) 以及目标值 \(B_i\). 一次操作可以选定一个区间 \([l, r]\),并将区间内所有数 ...

  3. Tensorflow学习笔记No.10

    多输出模型 使用函数式API构建多输出模型完成多标签分类任务. 数据集下载链接:https://pan.baidu.com/s/1JtKt7KCR2lEqAirjIXzvgg 提取码:2kbc 1.读 ...

  4. I/O接口

    目录 I/O接口的功能 接口的功能(要解决的问题) 接口的功能(具体操作) I/O接口的基本结构 接口和端口 I/O端口及编址 统一编址 独立编址 I/O接口的类型 小结 接口可以看作是两个部件之间的 ...

  5. 交换机配置OSPF负载分担

    组网图形 OSPF负载分担简介 等价负载分担ECMP(Equal-Cost Multiple Path),是指在两个网络节点之间同时存在多条路径时,节点间的流量在多条路径上平均分摊.负载分担的作用是减 ...

  6. Mac电脑完美解决 BasicIPv6ValidationError 问题,通过命令行更改ip设置

    在更改mac电脑ip网络时,提示BasicIPv6ValidationError.

  7. oracle 常用语句2

    -- number(38) -- char(2000) -- varchar(4000) create table student( sno number(3) primary key, sname ...

  8. Vscode下载与配置(C语言)

    目录 VScode 一.VScode下载 二.设置中文 三.Vscode界面介绍 1.活动栏 2.侧边栏 3.编辑栏 4.面板栏 四.VScode配置 1.C&C++配置 第一步 下载安装Mi ...

  9. [水题日常]UVA1625 Color Length

    来整理一下思路- 一句话题意:给两个大写字母的序列,每次取出其中一个数列的第一个元素放到新序列里面,对每个字母\(c\)记它的跨度\(L(c)\)为这个字母最后出现的位置-第一次出现的位置,求新序列所 ...

  10. 2、MyCat读写分离

    1.主从复制 搭建mycat的读写分离,首先我们现需要搭建mysql的主从复制 [1].Mysql主从复制原理 [2].MySQL主从复制配置 (1).主机配置 修改配置文件:vim /etc/my. ...