一个生命周期+对象池的设计问题

这边需要实现一个需求,就是做一个结点的对象池。就是所有结点都从池子里取,池子里没有就用prefab创建,所有结点被移除的时候就返回池子。

结点的移除是通过设置parent为null实现的,然后

onDisable(): void{
console.log(“onDisable”);
BulletPool.instance.recycleElement(this.node);
}

我在组件的这个方法里进行了回收。
但是测试下来,发现这个结点可能没问题,但是这个结点的子节点会出现属性不完整的情况。然后就各种报错,完全不能工作。

想问一下creator里是怎么去实现结点对象池的呢?

Chatgpt是这么回答的,你先试下 :smirk_cat:

2

现在不是不知道怎么写内存池的模块,而是不知道在哪个时间点进行节点回收。

如果通过设置空父亲,然后监听ondisable的方式不合适。我现在唯一的想法只好直接去隐藏节点了。但这其实不是特别符合常规思维,我觉得不太好。

还是2dx可以自己管理内存好,一个retain屁事都没有了


具体什么属性不完整,或者报什么错贴出来啊,不然别人怎么猜得到

表现就是从复用这个节点时的子节点的欧拉角的字段为空。通常来说,就是这个节点的对象被破坏了。至少2dx里会是这样,creator这边的ts应该类似。

2dx的节点也有引用计数,是可以当作资源来缓存也不必担心切换场景时节点被销毁,但是creator的节点不行。资源是资源,节点是节点。但是有api让你将节点设置成持久节点避免切换场景的节点销毁问题。

是的,道理都懂,换成2dx这个功能信手拈来,但是在creator里面,我用2dx的思路去实现就出问题了。
所以来这边问一下大家都是怎么去实现对象池的。另外,设置成永久节点这个事并不是解决这个问题的方案。

你这是自己实现对象池吗?
cocos creator本身就提供了这个东西 NodePool.
我用得好好的,回收就put,取出就get。很方便没有问题

哦哦,我以为没有就自己去写了,然后一堆问题。。。既然有那我直接用官方的,谢谢了

问题的原因找到了,并不是我的使用方法不对,或者内存池模块写的不对。
因为另外的人把之前报错的节点destroy了,所以在对象池里拿到的结点的子节点才会缺失数据。太坑了。。。

不过最起码我之前的分析还是对。。。只能这么自我安慰了,不然就翻车了