Performance 在SpriteKit中childNodeWithName的性能如何?

Performance 在SpriteKit中childNodeWithName的性能如何?,performance,sprite-kit,big-o,Performance,Sprite Kit,Big O,在SpriteKit中,SKNode的方法childNodeWithName:在接收节点的子节点中搜索具有特定名称的节点。我知道 但是性能呢?我的意思是,是否知道它是如何实现的 这个问题的可能答案是: 它的计算复杂度为O(n),因为它确实遍历所有子对象 它的计算复杂度为O(logn),因为它确实使用了一些索引结构 我为什么要问这个问题 如果它是用循环实现的,那么它的复杂性为O(n)(其中n是当前节点的子节点数)。然后我们应该避免在一些关键点调用它,比如游戏场景的更新方法。至少当有很多孩子的时候。

在SpriteKit中,SKNode的方法
childNodeWithName:
在接收节点的子节点中搜索具有特定名称的节点。我知道

但是性能呢?我的意思是,是否知道它是如何实现的

这个问题的可能答案是:

  • 它的计算复杂度为O(n),因为它确实遍历所有子对象
  • 它的计算复杂度为O(logn),因为它确实使用了一些索引结构
  • 我为什么要问这个问题


    如果它是用循环
    实现的,那么它的复杂性为O(n)(其中n是当前节点的子节点数)。然后我们应该避免在一些关键点调用它,比如游戏场景的更新方法。至少当有很多孩子的时候。

    在优化我的iOS游戏几个小时后,我相信
    childNodeWithName:
    的运行时间是线性的,而不是对数的

    我正在处理的情况是: 场景中有500个节点,每个节点都有一个唯一的名称(4字节UUID,我知道这不是最佳做法)。每100毫秒,我调用
    childNodeWithName
    ,以便从服务器端应用更新。然后,很明显,我观察到了意外的fps下降,即使服务器没有更新(这意味着只有
    childNodeWithName
    被调用并立即返回)


    因此,我决定用定制的
    集合
    替换
    childNodeWithName
    ,只是为了检查SKNode是否包含具有特定名称的节点。它成功了,fps下降消失了。

    作为半回答,苹果强烈建议我们缓存
    childNodeWithName
    EnumerateChildNodeWithName
    调用的结果

    见:

    WWDC 2014-第608期-打造精灵套件游戏的最佳实践,16分钟标志

    其含义很清楚:无论查找表的速度有多快,如果有经常引用的对象,那么应该保留对它们的引用。(尤其是以60帧/秒的速度。)

    至于查找机制,这些收集容器/集群经过高度优化,并根据许多因素使用不同的算法。所以我们不能假设NSDictionary、NSArray、NSSet或它们的Swift变体实际上可以作为哈希表或任何东西工作。并且,除非另有标记,否则不能假设具有特定的O(*)特性

    (谷歌对NS[Collection]底层实现细节进行了激动人心的分析。)


    e、 g.

    为什么投反对票?我只是问一个方法的性能(例如O(n),O(logn),…)。除非有人向你提供答案和证明(我不希望这样,因为谁知道苹果是如何做的),我建议你对n={1000,5000,10000,50000等}个孩子做一些测试,看看你发现了什么。我也很好奇。谢谢你的回答和对WWDC会议的参考。