【发布时间】:2021-06-13 11:20:12
【问题描述】:
我正在使用 SpriteKit 进行简单的性能测试,在其中创建了数千个 SKSpriteNode,大小为 50 x 50 像素,没有纹理,并使用 SKAction.rotate(byAngle:) 旋转它们,并在与另一个 SKSpriteNode 发生碰撞时将它们移除跟随鼠标的位置。
对于碰撞和接触,我不使用 SKPhysicsBody,因为它对性能非常重要,而是在更新方法中使用 For 循环来比较所有精灵节点的位置与鼠标跟随的节点的位置。
我获得了不错的性能,我可以在屏幕上有 17k 个精灵节点的同时保持 60 FPS。但是,我的问题是,在使用 OpenGL 和 Vulkan 进行渲染的其他框架中,我在类似的场景中得到了更好的结果,我可以在屏幕上保持 60 FPS 和 30k 精灵。由于 Apple 采用 Metal 和 SpriteKit 意味着要非常快,所以我期待 SpriteKit 在这个简单的实验中是最快的,我想知道是不是我做错了什么。
我确实研究了如何在 SpriteKit 中优化性能,我发现的唯一相关信息是将 skView 的 ignoreSiblingOrder 属性设置为 true 以批量渲染具有相同 zPosition 的精灵。它确实有帮助,FPS 从 40 变为 60,屏幕上有 17k 个精灵。这就是我现在的位置。
我找不到可以使用的任何其他信息。我怀疑我可以改进在更新方法中比较精灵位置的方式,但我不确定如果有的话有什么选项。代码如下所示:
override func update(_ currentTime: TimeInterval) {
for i in greens{
if i.position.x - 25 < mouseSprite.position.x + 25 && i.position.x + 25 > mouseSprite.position.x - 25{
if i.position.y - 25 < mouseSprite.position.y + 25 && i.position.y + 25 > mouseSprite.position.y - 25 {
i.removeFromParent()
}
}
}
}
如果我禁用此代码并且我不删除任何精灵,那么我会在屏幕上获得 60 FPS 和 30k 精灵节点,而在其他框架中,如果我这样做,我可以在屏幕上以 60 FPS 渲染 50k 精灵。 SpriteKit 是最慢的,考虑到许多 Apple 开发人员似乎推荐 SpriteKit 以获得更好的性能并且想知道我是否做错了什么,我没想到会出现这种情况?
我是否可以尝试任何技术来进一步提高 SpriteKit 的性能,并获得与使用 OpenGL 和 Vulkan 进行渲染的其他框架类似的结果?
谢谢。
【问题讨论】:
-
只是为了在已接受的答案中添加一些额外的内容,
SpriteKit的另一个性能提升是设置view.shouldCullNonVisibleNodes = false并手动删除任何不需要的节点。 developer.apple.com/documentation/spritekit/skview/…
标签: ios macos performance optimization sprite-kit