请教一下对象池与普通数组存储对象的区别。

今天尝试着使用对象池,使用完成后回收以便下次使用。
我对象池的所有节点放在A节点下,那如果我一次性回收的话,是不是需要for循环遍历A节点的子节点。
然后依次put进对象池。

那这样的性能消耗与单纯我一开始不用对象池,用数组存上对象,然后取用,是不是性能也没有差多少呢?

另外一个问题就是,如果for循环遍历回收,那么每回收一次,子节点的数量就会减少,这样最后回收的数量应该是有问题的,应该会少一半。有没有其他更优雅的方法呢?

你用 nodepool 场景销毁,node 不会销毁,你用数组存起来场景销毁,节点就不存在了。
回收少了一半,你就先用数组存起来 children.slice(),再对这个数组进行遍历

或者 while(childrenCount>0) 回收一个

for循环那个问题是,你回收某个节点i后,这时数组长度变小,原本i+1位置的元素排到了i位置,然后i自增,你的循环就错过了一个节点。
这本质上是循环删除问题。
在js或者一些其他的脚步语言,比如lua中,一般会用从末尾索引开始往前遍历的方式做删除
也就是:
for (let i = arr.length - 1; i >= 0; i–)
这样中途删除元素,不会有影响。

1赞

若果node.parent = null的情况下储存到自己的数组, 在场景销毁是节点也不会受影响的

你的第一个问题,自己用个数组去存储 取用 ,本质上就是你自己构造了一个对象池。
对象池是为了创建大量节点的性能消耗发明出来的,核心就是用过的节点不销毁,而是先放着,当需要的时候再拿出来,避免大量销毁-创造产生的创建节点的性能消耗。
可能存在自己用数组存取比使用对象池更合适的情况,你可以自己视情况而定。

当然你用一个数组存起来也可以实现这样的功能,那如果你有abcd四个节点,每一个节点都有很多子节点。你怎么去设计呢。你要用四个数组吗?
自己在节点做一层封装吧,比如pool.puts(values:any[]); 传一个数组也可以的啊。

没区别!!

对象池是用来减少重复创建对象的,它的出发点是重复利用内存,跟普通数组有什么好比的
别人开挖土机建房子,你非要说没有你的跑车跑得快,那不是耍赖嘛

以前我也有这问题,现在我的理解是这样的。
节点池是比数组更接近应用层的存储方法。你可以通过数组,对象,甚至哈希表这些基本的结构去实现对象池的功能,只要你喜欢,你觉得方便。在存储的基本功能的基础上,封装的节点池还可以丰富其他的功能。比如最重要的,放进节点池的对象你总要把事件注册清理掉吧,还要标识里面的节点不可再用了,它现在不是普通可操作的节点,唯一的合规操作就是静静的躺池子里,等待下一次放出来才会变回正常节点,只是简单的放数组显然只满足了最基本的存储功能

[quote=“1835516740, post:10, topic:158205”]
程序就两大方向,一个是性能方面的,一个是设计方面的。对象池只是一种设计思想,是对对象的操作管理及代码复用的一个工具类你可以这样理解。