Cocos Creator 上手记录 八

# 使用对象池

对象池的使用,可以有效的减少系统使用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方法。

你可能感兴趣的:(Cocos Creator 上手记录 八)