Cocos Creator 3.3中的NodePool(节点池)

引擎版本:3.3

不知为何,我在官方的3.3版文档和3.3版API里都没有找到NodePool的介绍。

进入cc.d.ts声明文件,可以看到NodePool类的大致描述。

 `NodePool` 是用于管理节点对象的对象缓存池。

它可以帮助您提高游戏性能,适用于优化对象的反复创建和销毁

一些常见的用例是:

     *      1.在游戏中的子弹(死亡很快,频繁创建,对其他对象无副作用)

     *      2.糖果粉碎传奇中的木块(频繁创建)。

     *      等等....

NodePool类既然起名叫做“池”,那必然可以塞节点进去和拿节点出来了。这两种方法分别是put()和get()。也就是说,用完的节点不要扔,裹上面包糠再放锅里炸,隔壁的小孩都馋哭了QAQ

一个节点的生成和销毁需要一定的开销,如果游戏中有大量可再利用的节点,例如源源不断的脆皮敌方小兵,打到目标就消失的机枪子弹等等,那我们就可以为这个可重复的节点创建一个专属的NodePool。注意一个NodePool最好只针对一种节点对象来使用。

private _EnemyPool: NodePool = new NodePool("Enemy");//参数是节点的名字,string类型

NodePool是一种类似于队列的数据结构。当一个节点在游戏中光荣退休时(例如敌方小兵被判定嗝屁),我们可以调用为这个节点准备的节点池的put()方法,注意参数是Node。这样就算把这个退休节点塞到队列里了,这个节点可能完全没有意识到,终究有一天它还是要再就业的。。。

 this._EnemyPool.put(this.node);//第二个this可以替换为任意导入的模块,反正参数是node就行

那么get()的方法的调用时机我相信你们都猜出来了,就是可以请老将再出山的时候(敌方小兵在某地钻出来了)。注意get()的返回值是Node类型。如果此时节点池里根本没有节点,那你只能得到返回值null。为了避免这种情况,我们之后还要判断一下是否得到了null,如果确实是null,我们就只能再创建新的节点来用了。理想状况下,随着池子里的节点越来越多,最终池子里的节点数量会维持在一定数量。

let node = _EnemyPool.get();

哎?好像有点不对劲,如果你的文档编辑器有装有IntelliSense扩展,会发现get方法的语法提示是这样的

(method) NodePool.get(...args: any[]): Node

在此注明一下,三个点...表示剩余参数,意味着这里的参数可以没有,也可以有好多。

也就是说,get是可以有参数的,那么这个参数是干什么的呢?继续阅读注释,就可以得知,在调用get()方法时,也会调用节点的reuse()函数。那么这个reuse()是什么?

原来Cocos Creator为我们准备了一个接口,接口名字叫做IPoolHandlerComponent。源代码如下

export interface IPoolHandlerComponent extends Component {
        unuse(): void;
        reuse(args: any): void;
}

这里说一下,接口是一种类型规范,我们可以用类来实现这个接口,为了让这个类满足接口的规范,我们必须要在类中实现unuse和reuse函数。并且需要注明的是,由于这个接口继承了Component类(此时这个接口里包含了Component类中所有成员的声明),接下来我们用来实现这个接口的类必须是Component类的子类。下面的代码演示可以留意一下。

我们只需要在节点的脚本中实现这个接口就行了。这里还是以敌方小兵为例

export class Enemy extends Component implements IPoolHandlerComponent{

    /*一堆代码*/

    unuse() {

        /*一堆代码*/

    }

    reuse(args:any) {//请注意,这里的参数就是传给get()方法的参数

        /*一堆代码*/

    }
}

那么unuse方法是干啥的?这随便猜猜就知道一定是调用put()方法时调用的。这两个函数方便我们在把节点送入池子和“再就业”之前做好准备工作,比如我们可以先让小兵“再就业”前就定好出场的坐标和血量。

其实我们在进入NodePool前后都可以拿到节点,可以自行用代码做好“准备工作”再塞入节点池或者再出场,之所以提供这样的接口,可能是照顾老版本Cocos Creator用户的使用习惯,也可能考虑到让老版本游戏代码升级时的改动幅度尽可能小。

NodePool还有size()和clear()方法。毕竟是个队列嘛,不过一般用不上。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值