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

时间:2018-07-25 09:19:43

标签: ios swift sprite-kit skspritenode sknode

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

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,取决于设备)

如何处理此帧丢失?

2 个答案:

答案 0 :(得分:1)

您可以将计算作业推入后台队列以阻止它们阻塞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($0)
            }
        }
    }
}

答案 1 :(得分:1)

我不建议将它们推入后台线程。您将遇到一些问题,可能是您的游戏需要一个平台,但后台线程未能及时启动,因此没有平台可为主线程做好准备。

相反,您应该在游戏中开发一个“加载”阶段,并且在此阶段中,您一次加载屏幕上需要的平台数量,并且要多一点。然后,您无需重复创建新平台,而只是回收那些不在屏幕上的平台,因此无需在创建新平台上浪费时间和资源。

这本质上称为池化。

然后,当您发现池中的某个百分比为空时,可以使用后台线程方法作为备份计划。例如,当池减少到10%时,触发后台线程以生成更多线程。这样做仍然可以为您提供所需平台的10%,而后台线程会生成更多节点。