Laya Ts 简易对象池
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 简易对象池的更多相关文章
- Unity 游戏框架搭建 (十九) 简易对象池
在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...
- 通用对象池ObjectPool的一种简易设计和实现方案
对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- 简易高重用的jdbcutils工具封装实现类以及简易连接池实现
因为如今发现做个小项目都是导入n多的依赖包,非常烦琐,仅仅想快点开发完一个个的小需求项目,这个时候真心不想用框架,仅仅能自己写个jdbcutils,尽管网上有非常多有apache的,阿里的,可是感觉用 ...
- Egret中的对象池Pool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- paip.提升性能----数据库连接池以及线程池以及对象池
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax 艾龙, ...
随机推荐
- Spring framework核心
这一部分涵盖了Spring框架绝对不可或缺的所有技术. 1.IOC容器 1.1Spring IoC容器和beans介绍 org.springframework.beans和org.springfram ...
- BJOI2015 隐身术
落谷. Description 给你两个串 \(A.B\).询问 \(B\) 中有多少个非空子串和 \(A\) 的编辑距离不超过 \(K\). Solution 发现 \(K \le 5\),考虑可以 ...
- AGC043 B题题解
有的时候,碰到一道题,要给自己先设立部分分,再去想如何把部分分推广到一般情况.这题就是绝佳的例子. 不妨将\(a_i\)用\(a_i - 1\)替代,这样就变成了\(a_i \in \{ 0, 1, ...
- Java8新增的这些集合骚操作,你掌握了嘛?
目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...
- node目录
1 [了解nodejs] 1.1 [node简介] 1.2 [node的特点] 1.3 [如何安装] 1.4 [如何运行] 2 [es6--基本语法] 2.1 [变量的解构赋值] 2.2 [解构赋值] ...
- SQL注入----盲注总结
参考文章:https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247490388&idx=1&sn=c677837d7 ...
- BUUCTF 刮开有奖 WriteUp
题目链接 https://buuoj.cn/challenges#%E5%88%AE%E5%BC%80%E6%9C%89%E5%A5%96 题解 用IDA打开,按F5反编译,双击进入DialogFun ...
- zabbix学习(一)——LNMP环境搭建及zabbix安装
第一部分:LNMP环境搭建 一.环境说明: OS: centos7.6_x64nginx:nginx-1.16.0php: php-7.1.11mysql:mysql-5.6.44 zabbi ...
- windows 任何软件出现异常有日志 w3wp.exe [10608]中发生了未处理的Microsoft .Net Framework异常
右键我的电脑 管理
- IIS添加应用程序和虚拟目录
右键添加应用程序 别名就是虚拟路径 比如本来路径是http://localhost:44336/main.html 别名为 qwer 那么就可以访问http://localhost:4433 ...