SpriteKit中childNodeWithName的性能如何?

时间:2015-04-27 18:52:11

标签: performance sprite-kit big-o

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

但性能怎么样?我的意思是,它是如何实现的?

此问题的可能答案是:

  1. 它具有计算复杂度O(n),因为它会遍历所有子项
  2. 它具有计算复杂度O(log n),因为它确实使用了一些索引结构
  3. Reson我要问的原因

    如果使用 for循环实现,则它具有复杂度O(n)(其中n是当前节点的子节点数)。然后我们应该避免在某些关键点调用它,比如GameScene的 update 方法。至少在有很多孩子的时候。

2 个答案:

答案 0 :(得分:3)

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

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

所以我决定用自定义childNodeWithName替换Set<String>只是为了检查SKNode是否包含具有特定名称的节点。它起作用了,fps下降消失了。

答案 1 :(得分:1)

通过半答案,Apple强烈建议我们缓存 childNodeWithNameenumerateChildNodesWithName来电的结果。

请参阅:

WWDC 2014 - 第608期 - 构建精灵套件游戏的最佳实践,16分钟

含义很明确:无论查找表有多快,如果你有经常引用的对象,那么你应该保留对它们的引用。 (特别是60fps。)

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

(Google对NS [收集]低级实现细节进行了精彩分析。)

e.g。 http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/