在SpriteKit中,SKNode的方法childNodeWithName:
在接收节点的子节点中搜索具有特定名称的节点。我知道。
但性能怎么样?我的意思是,它是如何实现的?
此问题的可能答案是:
Reson我要问的原因
如果使用 for循环实现,则它具有复杂度O(n)(其中n是当前节点的子节点数)。然后我们应该避免在某些关键点调用它,比如GameScene的 update 方法。至少在有很多孩子的时候。
答案 0 :(得分:3)
在优化我的iOS游戏几个小时后,我认为childNodeWithName:
的运行时间是线性的而不是对数的。
我正在处理的情况是:
场景中有500个节点,每个节点都有一个唯一的名称(4字节UUID,我知道这不是最佳做法)。每隔100毫秒我为每个节点调用childNodeWithName
以从服务器端应用更新。然后,显然我观察到意外的fps下降,即使没有来自服务器的更新(这意味着只有childNodeWithName
被调用并立即返回)。
所以我决定用自定义childNodeWithName
替换Set<String>
只是为了检查SKNode是否包含具有特定名称的节点。它起作用了,fps下降消失了。
答案 1 :(得分:1)
通过半答案,Apple强烈建议我们缓存 childNodeWithName
或enumerateChildNodesWithName
来电的结果。
请参阅:
WWDC 2014 - 第608期 - 构建精灵套件游戏的最佳实践,16分钟
含义很明确:无论查找表有多快,如果你有经常引用的对象,那么你应该保留对它们的引用。 (特别是60fps。)
对于查找的机制,这些集合容器/集群是高度优化的,并根据许多因素使用不同的算法。所以我们不能假设NSDictionary,NSArray,NSSet或它们的Swift变体实际上用作哈希表或其他任何东西。并且,除非另有标记,否则不能假定具有特定的O(*)特征。
(Google对NS [收集]低级实现细节进行了精彩分析。)
e.g。 http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/