生成导致丢帧的新节点 [SpriteKit]

Generating new nodes causing frame drop [SpriteKit]

我正在尝试在场景中生成新节点

func generateNewPlatform(inScene: SKScene) {
   for _ in 0...25 {
       let xPosition = randomXPosition()
       let yPosition = randomYPosition()

       let platform = Platform.create(
       platform.position = CGPoint(x: xPosition, y: yPosition)
       inScene.addChild(platform)
   }   
}

我需要每 10 秒生成一次,当然我通过

删除旧的
removeFromParent()

但是当我这样做时,它会导致丢帧(1-5,取决于设备)

我该如何处理掉帧问题?

您可以将计算作业推入后台队列以阻止它们阻塞 UI,也许 Platform 创建成本很高:

func generateNewPlatform(inScene: SKScene) {
    var platforms = [Platform]()
    DispatchQueue.global(qos: .userInitiated).async {
        for _ in 0...25 {
            let xPosition = randomXPosition()
            let yPosition = randomYPosition()

            let platform = Platform.create(..)
            platform.position = CGPoint(x: xPosition, y: yPosition)
            platforms.append(platform)
        }
        DispatchQueue.main.async {
            platforms.forEach {
                inScene.addChild([=10=])
            }
        }
    }
}

我不建议将它们推入后台线程。您将 运行 遇到以下问题:您的游戏可能正处于您需要平台但后台线程未及时触发的位置,因此没有平台准备好用于主线程。

相反,您应该在您的游戏中开发一个 "Loading" 阶段,在这个阶段中,您将在屏幕上同时加载您需要的平台数量,并加载一些额外的平台。然后,不用再不断地重新创建新平台,您只需回收那些不在屏幕上的平台,因此无需浪费时间和资源来创建新平台。

这本质上称为池化。

然后当您发现您的池有一定百分比的空时,您可以使用后台线程方法作为备份计划。例如,当池下降到 10% 时,触发后台线程以生成更多。这样做的目的仍然是在后台线程生成更多节点的同时为您提供所需的 10% 的平台。