我正在尝试在场景中生成新节点
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,取决于设备)
如何处理此帧丢失?
答案 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%,而后台线程会生成更多节点。