cocos中的对象池

JavaScript对象池

    • ***1. 对象池的概念***
    • ***2. 对象池的使用***

不久前我做了一个塔防游戏,对塔射击的子弹就是频繁的创建和销毁处理的,后面才学习了解到cocos creator 提供了一种更好的处理方法就是 JavaScript对象池,在场景中维护一个子弹数组,回收并重用那些需要被销毁的子弹,现在就来讲讲对象池的概念和使用方法

1. 对象池的概念

对象池是一组可以回收的节点对象,可以通过创建NodePool的实例来初始化一组节点的对象池,需要创建节点的时候,首先向对象池申请节点,如果有空闲的节点,就可以返回并使用,需要销毁节点时,也是先进行移出操作,然后返回给对象池,这样就形成了节点的重用。

2. 对象池的使用

创建一个对象池,直接使用new的方式实例化就可以了,代码如下所示。

this.bulletPool = new cc.NodePool();
for(let i = 0; i < 20; i++){
    let bullet = cc.instantiate(this.bulletPrefab);
    this.bulletPool.put(bullet);
}

对象池的请求是通过get函数来获得的,首先需要判断是否有空闲的对象,如果没有就继续创建对象,代码如下所示。

let bullet = null;
if(this.bulletPool.size() > 0){
    bullet = this.bulletPool.get();
}else{
    bullet = cc.instantiate(this.bulletPrefab);
}

当对象不再使用的时候,通过调用put函数将对象返回对象池中,和刚开始创建的用法完全一样,这样就完成了从创建到回收再到重用的循环,避免了额外的内存开销和性能开销

对象池不再被需要时需要手动调用clear函数清空对象池,销毁其中缓存的所有节点。虽然当对象池实例不再被任何地方引用时,引擎的垃圾回收系统会自动对对象池中的节点进行销毁和回收,但这个过程不可控,所以最好调用clear手动清空。

你可能感兴趣的:(cocos,JavaScript,游戏开发)