Уменьшить отставание в Spritekit
Я получил некоторое отставание в игре, которую я делаю в Spritekit. Я полагаю, что проблема в том, что у меня много дел в блоке "spawn" SKAction.run. Проблема в том, что я не знаю, где еще это поставить. Я пытался создать leftcloud и rightcloud вне функции createClouds, но это приводит к сбою приложения... кто-нибудь знает, что делать? И это уменьшит отставание?
let spawn = SKAction.run ({
() in
self.createClouds()
})
let delay = SKAction.wait(forDuration: 1.2)
let spawnDelay = SKAction.sequence([spawn, delay])
let spawnDelayFE = SKAction.repeatForever(spawnDelay)
let waitSpawnDelayFE = SKAction.sequence([SKAction.wait(forDuration: 2), spawnDelayFE])
self.run(waitSpawnDelayFE)
let distance = CGFloat(self.frame.height)
let moveClouds = SKAction.moveBy(x: 0, y: -distance, duration: TimeInterval(0.0055 * distance))
let removeClouds = SKAction.removeFromParent()
moveAndRemove = SKAction.sequence([moveClouds, removeClouds])
func createClouds(){
cloudpair = SKNode()
let leftCloud = SKSpriteNode(imageNamed: "cloud2")
let rightCloud = SKSpriteNode(imageNamed: "cloud2")
leftCloud.physicsBody = SKPhysicsBody(texture: leftCloud.texture!, size: leftCloud.size)
leftCloud.physicsBody?.isDynamic = false
leftCloud.setScale(0.5)
leftCloud.physicsBody?.affectedByGravity = false
rightCloud.physicsBody = SKPhysicsBody(texture: rightCloud.texture!, size: rightCloud.size)
rightCloud.physicsBody?.isDynamic = false
rightCloud.setScale(0.5)
rightCloud.physicsBody?.affectedByGravity = false
leftCloud.position = CGPoint(x: self.frame.width / 2 - 160, y: self.frame.height)
rightCloud.position = CGPoint(x: self.frame.width / 2 + 160, y: self.frame.height)
cloudpair.addChild(leftCloud)
cloudpair.addChild(rightCloud)
cloudpair.run(moveAndRemove, withKey: "moveclouds")
cloudpair.name = "cloudpair"
cloudpair.addChild(scoreNode)
cloudpair.zPosition = 3
self.addChild(cloudpair)
if cloudpair.position.x > 110 {
rightCloud.removeFromParent()
} else if cloudpair.position.x < -110 {
leftCloud.removeFromParent()
}
}
1 ответ
Вы динамически создаете физические тела на лету, и это дорого, и, вероятно, именно это и вызывает ваше отставание.
то, что я хотел бы сделать, это создать массив облачных объектов при загрузке сцены, а затем просто переключаться между ними, когда вам нужно облако. Таким образом, объекты создаются во время загрузки сцены, и вы получаете немедленный доступ к без задержки
private var leftClouds = [SKSpriteNode]()
private var rightClouds = [SKSpriteNode]()
private var currentCloundIndex = 0
func createClouds() {
//assuming your left and right clouds are different
for x in 0..<10 {
let leftCloud = SKSpriteNode(imageNamed: "cloud2")
leftCloud.physicsBody = SKPhysicsBody(texture: leftCloud.texture!, size: leftCloud.size)
leftCloud.physicsBody?.isDynamic = false
leftCloud.setScale(0.5)
leftCloud.physicsBody?.affectedByGravity = false
leftClouds.append(leftCloud)
}
for x in 0..<10 {
let rightCloud = SKSpriteNode(imageNamed: "cloud2")
rightCloud.physicsBody = SKPhysicsBody(texture: rightCloud.texture!, size: rightCloud.size)
rightCloud.physicsBody?.isDynamic = false
rightCloud.setScale(0.5)
rightCloud.physicsBody?.affectedByGravity = false
rightClouds.append(rightCloud)
}
}
затем, когда вам нужно облако, просто извлеките его из массива с помощью currentCloundIndex, а затем увеличьте currentCloundIndex
let leftCloud = leftClouds[currentCloundIndex]
let rightCloud = rightClouds[currentCloundIndex]
currentCloundIndex += 1
if currentCloundIndex >= 10 {
currentCloundIndex = 0
}