【已解决】关于对象池的管理!

嗯,这个我知道,你说的没错。我demo这里是写的不对。我看看我正式 项目里的情况,再测一遍。

我试过缓存池对象加动画,回收前什么动画,取出来后接着放,我就知道了回收前要重置对象的状态,只是重置,又不是重新初始化

嗯,理论上我每次拿出来之前,重新初始化状态也是对的啊。

你this._unitNodePool.put(unit) 这个unit是个node ,但是recycle函数里面你put的就是个组件了(使用了getComponent)

let unitView = unitNode.getComponent(UnitView);
this._unitNodePool.put(unitNode);

不是。

我只是说 这点就有问题 没具体看其他的

官方例子 會這樣嗎

你指的360层,是循环里循环了180次,我测试时把循环给我90次了。
你设计的是不是配置文件里是0的时候,图片就是不显示的,所以你觉得我给你截图的代码没有问题。
但是,我理解的是,初始情况下为0不显示是符合你的预期的,但是当你把这个对象放回到内存中后和再次去处理啊,图片的active是不是没有设置为true?
这种情况下,就会出现虽然创建了对象了,但是没有显示出来。
比如,你配置文件中需要创建为1的对象为6个(另一个为0),按理说应该显示6个对象,但是却只显示了5个,是因为,有一个对象的图片active=false。
你每次从对象池里取出对象来,都做了初始化:
let sp = this.imgNode.getComponent(cc.Sprite);
……
但是,此时的imgNode.avtive如果已经是false了呢。。


之所以, 比较关注这个问题,是因为我们的游戏也遇到内存优化的问题了。。
如果事后证明我的分析是错误的,麻烦在帖子里说一下正确的思路,感谢!

/
这个位置,你的分析是对的。

现在的问题还没有完全解决,我还在想办法调试。

加上这几行代码呢?

加了当然有用啊,不过现在问题不在这,原因是我的这个demo还是没有写好。我还在想办法调试找出其中的问题。

这个Demo的问题就在于放进对象池的部分节点子节点被active=false了,拿出来的时候又没有active=true。你的项目里还有别的问题吗?
附一个代码建议:

这个不错。

有问题,不过bug出现的很不规律,我还在找这个bug的规律。

多注意一下对象池拿出来的东西,把有修改过的属性恢复默认值再用。

开始的时候先跳过600层,再0.3秒自动移动一层。快速查看问题,不需要鼠标一直点。给你参考一下。

@banshaotang @365617437

经过我废寝忘食的连续不断的调试。,我找到项目里的问题了。这里公布一下答案,不是引擎的bug,而是我自己的一个使用错误:

1.我先使用对象池clear了所有 node;
2.父结点在执行 destroy的时候,又把上面的node put进了对象池。

所以才导致了莫名的bug。经过优化,功能已健全。

最后谢谢楼上每一位大佬对本帖的参与,感谢大佬们对我的代码提出的各种意见也非常的关键,感谢cctv,感谢cocos.

1赞

帖子题目已修正,不能误人子弟。

:10::10::10:

很好很好

请教一下, 我现在做一个单场景的游戏,场景一开始就在十几个对象池里面存放了数量不等的对象, 一共可能有350个, 不知道这样多数量的对象池和对象会对游戏运行造成影响吗?会有有多大影响?