SpriteKit - 如何提高性能?

SpriteKit - How to improve performance?

我正在使用 SpriteKit 进行简单的性能测试,我在其中创建了数千个 SKSpriteNode,大小为 50 x 50 像素,没有纹理,并使用 SKAction.rotate(byAngle:) 旋转它们,并在与跟随鼠标位置的另一个 SKSpriteNode。

对于碰撞和接触,我不使用 SKPhysicsBody,因为它对性能的要求很高,而是在更新方法中,我使用 For 循环来比较所有精灵节点的位置与跟随鼠标的精灵节点的位置。

我的性能不错,我可以保持 60 FPS,同时屏幕上有 17k 个精灵节点。但是,我的问题是,对于使用 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 进行渲染的其他框架类似的结果?

谢谢。

Is there any techniques I could try to further improve performance with SpriteKit

我将专注于这一部分,因为使用繁重的通用库永远无法达到与手动编写所需的相同的性能(就像使用裸机一样) -例如骨骼 Vulkan 代码)。

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

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

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