# 使用对象池
对象池的使用,可以有效的减少系统使用cc.instantiate和node.destory进行节点创建和销毁时性能的损耗
* 用法
// 声明一个对象池
this.enemyPool = new cc.NodePool();
// 规定对象池的数量为5
let initCount = 5;
for(let i = 0; i < initCount; i++) {
// 通过预设资源创建节点
let enemy = cc.inistantiate(this.enemyPrefab);
// 加入到对象池中, 接口与对象池回收节点接口一样, 他会自动removeFromParent这个节点。
this.enemyPool.put(enemy);
}
// 从对象池请求一个对象
let enemy = null;
// 通过.size方法判断当前对象池所剩对象个数
if (this.enemyPool.size() > 0) {
// 对象池.get方法返回池内对象本身
enemy = this.enemyPool.get();
} else {
// 此时对象池内没有空闲对象,需要创建新的对象,避免报错
enemy = cc.inistantiate(this.enemyPrefab);
}
// 将生成的敌方加入到节点中
enemy.parent = parentNode;
// 然后调用enemy节点上的脚本进行初始化
enemy.getComponent('Enemy').init();
// 用对象池回收对象
this.enemyPool.put(enemy);
// 清楚对象池
this.enemyPool.clear();
* 也可以使用对象池缓冲同一类型组件。 比如:一个menu菜单下的子项 menuItem
// 创建组件对象池, 参数写组件名, 会自动创建多个组件
let menuItemPool = cc.NodePool('menuItem');
当使用menuItemPool.get() 获取节点后,会自动触发menuItem里的reuse方法, 完成一些数据初始化和事件绑定。
当使用menuItemPool.put(menuItemNode) 回收节点后, 会调用menuItem里的unuse方法, 完成一些事件的反注册。
另外, cc.NodePool.get()方法还可以传入任意数量类型的参数, 这些参数会原样传递给组件的reuse方法。