当前位置:网站首页>Cocoscreator+typescripts write an object pool by themselves
Cocoscreator+typescripts write an object pool by themselves
2022-07-06 22:43:00 【Casimodo said】
Why object pools are needed ?
Create nodes at runtime (
cc.instantiate
) And destroy (node.destroy
) Operations are very performance intensive , So we are in a more complex scene , Usually only in the scenario initialization logic (onLoad
) Nodes will be created in , Nodes are destroyed only when the scene is switched . If you make an action game with a large number of enemies or bullets that need to be generated and destroyed repeatedly , How can we create and destroy nodes at any time during the game ?
Many people will go to the official documents to check , Is there any way to solve ? Links to official documents about object pools :
Use object pool · Cocos Creatorhttps://docs.cocos.com/creator/2.3/manual/zh/scripting/pooling.html?q= So this time, I'd like to introduce my object pool :PoolMgr.ts
Define an object , Put the initialized object inside :
public static _dictPool: Object = {}
initialization hui Object pool :
/**
* Initialize object pool
* @param count The amount generated
* @param prefab The prefabricated body that generates the node
*/
public static initPool(count:number,prefab:cc.Prefab){
for (let index = 0; index < count; index++) {
let node:cc.Node = cc.instantiate(prefab);
this.setNode(node);
}
}
This is self written initialization , Generally, the object is initialized in the loading interface , You can call directly in the game .
Get an object in the object pool :
/**
* Access to the node
* @param prefab The prefabricated body that generates the node
* @param parent The parent of the node
* @returns Generate or nodes in the object pool
*/
public static getNode(prefab:cc.Prefab,parent:cc.Node){
let name = prefab.name;
let node:cc.Node = null;
if(this._dictPool[name]){
let pool = this._dictPool[name];
if (pool && pool.size() > 0) {
node = pool.get();
} else {
node = cc.instantiate(prefab);
}
}
else{
let pool = new cc.NodePool();
this._dictPool[name] = pool;
node = cc.instantiate(prefab);
}
node.parent = parent;
return node;
}
Recycle an object :
/**
* Recycle node
* @param node Recycled nodes
*/
public static setNode(node:cc.Node){
const name = node.name;
let pool = null;
if(this._dictPool[name]){
pool = this._dictPool[name];
}
else{
pool = new cc.NodePool();
this._dictPool[name] = pool;
}
if(pool.size() > 100){
node.destroy();
return;
}
pool.put(node);
}
Examples of use :
let count:number = 10;
let path:string = "xx";
sc.load.LoadPrefab(path,(prefab:cc.Prefab)=>{
PoolMgr.initPool(count,prefab);
});
Call the initialization interface when loading resources , This initializes 10 Preform corresponding to the path ;
Set up :
let node = PoolMgr.getNode(prefab,parent);
Obtain preform , Set parent node , You can get this node ;
Recycling :
PoolMgr.setNode(node);
Pay attention when recycling nodes : If you make any changes to this node , For example, its rotation 、 Zoom, etc , Note its properties when used again .
边栏推荐
猜你喜欢
欧洲生物信息研究所2021亮点报告发布:采用AlphaFold已预测出近1百万个蛋白质
Signed and unsigned keywords
Aardio - integrate variable values into a string of text through variable names
Advantages of link local address in IPv6
MySQL----初识MySQL
手写ABA遇到的坑
树的先序中序后序遍历
Unity3d minigame unity webgl transform plug-in converts wechat games to use dlopen, you need to use embedded 's problem
UE4蓝图学习篇(四)--流程控制ForLoop和WhileLoop
Mysql database basic operations DML
随机推荐
Pit encountered by handwritten ABA
MySQL----初识MySQL
Dealing with the crash of QT quick project in offscreen mode
视图(view)
项目复盘模板
Detailed explanation of ThreadLocal
Traversal of a tree in first order, middle order, and then order
extern关键字
rust知识思维导图xmind
pytorch_YOLOX剪枝【附代码】
2014阿里巴巴web前实习生项目分析(1)
That's why you can't understand recursion
Aardio - 不声明直接传float数值的方法
NPM cannot install sharp
做国外LEAD2022年下半年几点建议
General implementation and encapsulation of go diversified timing tasks
剪映+json解析将视频中的声音转换成文本
Clip +json parsing converts the sound in the video into text
UVa 11732 – strcmp() Anyone?
cuda 探索