当前位置:网站首页>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 .
边栏推荐
- CocosCreator+TypeScripts自己写一个对象池
- OpenNMS separation database
- Typescript get function parameter type
- Mise en place d'un environnement de développement OP - tee basé sur qemuv8
- Inno setup packaging and signing Guide
- Installation and use of labelimg
- Is there any requirement for the value after the case keyword?
- three.js绚烂的气泡效果
- POJ 1258 Agri-Net
- 项目复盘模板
猜你喜欢
随机推荐
变量与“零值”的比较
2022-07-05 use TPCC to conduct sub query test on stonedb
Build op-tee development environment based on qemuv8
POJ 1094 sorting it all out
SQL server generates auto increment sequence number
视图(view)
ACL 2022 | 序列标注的小样本NER:融合标签语义的双塔BERT模型
[untitled]
Aardio - 利用customPlus库+plus构造一个多按钮组件
【无标题】
Extern keyword
柔性数组到底如何使用呢?
On the problems of born charge and non analytical correction in phonon and heat transport calculations
2014 Alibaba web pre intern project analysis (1)
Custom swap function
自定义 swap 函数
const关键字
Windows Auzre 微软的云计算产品的后台操作界面
Inno setup packaging and signing Guide
MySQL教程的天花板,收藏好,慢慢看