在 SpriteKit 中,SKNode 的 childNodeWithName:
方法在接收节点的子节点中搜索具有特定名称的节点。我知道。
但是性能呢?我的意思是,它是如何实现的?
这个问题的可能答案是:
- 它的计算复杂度为 O(n),因为它会遍历所有的 child
- 它的计算复杂度为 O(log n),因为它确实使用了一些索引结构
我问的原因
如果用for循环实现,那么它的复杂度为O(n)(其中n是当前节点的子节点数)。那么我们应该避免在一些关键点调用它,比如GameScene的update方法。至少在有很多 child 的时候。
最佳答案
在优化我的 iOS 游戏几个小时后,我相信 childNodeWithName:
的运行时间是线性的而不是对数的。
我正在处理的情况是:
场景中有 500 个节点,每个节点都有一个唯一的名称(4 个字节的 UUID,我知道这不是最佳做法)。我每 100 毫秒调用一次 childNodeWithName
为每个节点从服务器端应用更新。然后,显然我观察到 fps 意外下降,即使没有来自服务器的更新(这意味着只有 childNodeWithName
被调用并立即返回)。
所以我决定替换 childNodeWithName
定制 Set<String>
只是为了检查 SKNode 是否包含具有特定名称的节点。它奏效了,fps 下降消失了。
关于performance - childNodeWithName在SpriteKit中的表现如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903745/