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

Posted

技术标签:

【中文标题】生成导致丢帧的新节点 [SpriteKit]【英文标题】:Generating new nodes causing frame drop [SpriteKit] 【发布时间】:2018-07-25 09:19:42 【问题描述】:

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

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 秒生成一次,当然我删除 old by

removeFromParent()

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

我该如何处理掉帧?

【问题讨论】:

尝试将所有计算移入DispatchQueue,只在主队列中运行addChild @Tj3n 我编辑有问题的代码,我需要在哪里尝试使用它?在'addChild'之前的'for'之后? 这取决于您要如何编写它,如果您需要一次更新所有它们,然后将循环包装在DispatchQueue中并将platform节点添加到一个数组中,然后调用@987654327 @ 和 addChild 在主队列中循环 谢谢你???? ??? .我将 .global(qos: .userInteractive)addChild 中的循环包装到主队列中,看起来它可以工作。 很高兴听到,我已将其总结为答案 【参考方案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)
            
        
    

【讨论】:

【参考方案2】:

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

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

这本质上称为池化。

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

【讨论】:

以上是关于生成导致丢帧的新节点 [SpriteKit]的主要内容,如果未能解决你的问题,请参考以下文章

dp83640丢帧

创建没有丢帧的无尽 cgpath

视频丢帧(详解)

Spritekit中的新场景没有显示任何内容?

SpriteKit - 生成随机节点

Android 渲染优化