вы динамически создаете физические тела на лету, и это дорого, и, вероятно, именно это и вызывает ваше отставание.
я бы создал массив облачных объектов при загрузке сцены, а затем просто перебирал их, когда вам нужно облако. Таким образом, объекты создаются во время загрузки сцены, и вы получаете немедленный доступ к без задержки
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
}