【问题标题】:SpriteKit - How to improve performance?SpriteKit - 如何提高性能?
【发布时间】: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 进行渲染的其他框架类似的结果?

谢谢。

【问题讨论】:

标签: ios macos performance optimization sprite-kit


【解决方案1】:

我有什么技巧可以尝试进一步提高 SpriteKit 的性能

我将专注于这部分,因为使用繁重的通用库将永远无法获得与通过手写准确地编写所需内容相同的性能(就像使用准系统一样)以 Vulkan 代码为例)。

优化SpriteKit本身也是遥不可及的,是什么,是什么。

可以做的就是专注于您自己的代码。特别查看您的更新功能,您在每一帧迭代每个对象,希望它们在您的鼠标下方,但鼠标位置一次只能在屏幕上的一个位置。因此,如果您将数据划分为屏幕象限,您只能测试所有这些象限中的一小部分。

您可以在统一的网格中执行此操作(如 10x10 或其他东西,具体取决于您的窗口形状),或者编写一个完整的八叉树,将组划分为更多的桶,它们聚集的越多。

【讨论】:

  • 感谢您的建议,它非常有用,不确定我是否正确实现了这个概念,我已将场景划分为 8 个区域,并将精灵的引用存储在每个区域的不同数组中,并且仅将位置与与鼠标位于同一区域的那些精灵进行比较。这样我就可以在屏幕上以 60 FPS 的速度渲染 26k 个精灵。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2020-09-09
  • 2012-06-24
  • 2021-05-28
  • 2020-03-31
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多