生成导致丢帧的新节点 [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]的主要内容,如果未能解决你的问题,请参考以下文章