一个节点下面有N个相同名字的子节点,怎么获取最省性能?

发现用find或getChildByName只能获取到一个节点,不能同时以数组形式获取到所有同名节点,如果遍历父节点所有子节点又感觉挺费性能,比如父节点有百来个子节点,我只想获取同名字的某十个子节点,能不能有类似getChildsByName(“子节点名称”)这样的APi可以直接以数组形式获取到多个同名节点。

find或getChildByName本就是会遍历子节点的。

不知道 getComponentsInChildren 能不能曲线救国一下,如果不能那你就自己实现吧,因为你这个情况我想想不出来使用的场景,个人认为,你想管理同类节点,不应该在创建节点的时候就去将其加入管理队列么?为啥还需要每次都要遍历子节点的名字呢?

同一个节点下 直接用数组下标不就可以了?

node.children.filter((child) => child.name === name)

2赞

啪的一下,很快啊!

最快方法应该还是在编辑器里拖进数组 (麻烦)
运行时的话,基于现有 cc,最快不可能超过 O(N)

还有一种方案是, 替换 node.addChild / node.removeChild, 直接存起来。 好像也有个 Node.EventType.CHILD_ADDED / REMOVED

filter的本质不还是遍历一遍吗,他说的意思是希望不遍历吧

O(1)情况下不是很简单就能用map来遍历保存所有层级节点的引用吗?。。莫非大家都是调包王者?

如没有预处理机制,都是逃不过遍历

是否可以把相同名称的节点放在同一个父节点下。你看底层的getComponentsInChildren,也都是遍历所有子节点的所有组件,没有说不遍历的

这个方法可以试试,虽然可能底层都是要遍历一下才能找出同名称的,这个也算是比较简便的方法,不用自己再去遍历。

单独放一个父节点是可以节省遍历消耗的性能,但是有时候不是太方便单独弄父节点。

那就添加节点的时候校验名称,然后存到数组中

这也是个办法,预先把这些节点存放到一个数组,等用到的时候不用再查找父节点了,直接从这个数组调用。

我感觉你需求都没搞清楚,你到底是想要性能呢?还是只是想要一个foreach的简单方便api?

这不可能不遍历吧,要想不遍历,除非重写addChild,根据名字存不同数组。

当然是优先考虑性能,方法简单复杂也就是实现一次,以后用都是复制黏贴了。