Ошибка с очередью отправки Swift
Я пытаюсь создать генетический алгоритм для запуска гоночных автомобилей по гоночной трассе. Каждый автомобиль получает случайные инструкции, которые применяют силу к автомобилю и поворачивают автомобиль на определенное количество градусов. Чтобы разложить новые инструкции, данные каждой машине, я использовал время задержки в очереди отправки, которое добавляет 0,2 секунды к предыдущей инструкции. например
0 секунд - первая инструкция
0,2 секунды - вторая инструкция
0,4 секунды третья инструкция
и так далее...
У меня проблема в том, что после выполнения нескольких инструкций я начинаю замечать более длительную задержку между инструкциями, вплоть до того момента, когда новая инструкция применяется, скажем, через 2 секунды.
Вот мой код ниже.
func carAction(newCar: [[CGFloat]], racecar: SKSpriteNode) {
var caralive = true
let max = 1000
var count = 0
let delayTime = 200000000
var deadlineTime = DispatchTime.now()
while count < max {
let angleChange = newCar[count][1]
let speedChange = newCar[count][0]
count += 1
deadlineTime = deadlineTime + .nanoseconds(delayTime)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
if caralive == true {
print(DispatchQueue.main)
racecar.physicsBody?.angularVelocity = 0
let rotate = SKAction.rotate(byAngle: (angleChange * .pi / 180), duration: 0.2)
racecar.run(rotate)
let racecarRotation : CGFloat = racecar.zRotation
var calcRotation : Float = Float(racecarRotation) + Float(M_PI_2)
let Vx = speedChange * CGFloat(cosf(calcRotation))
let Vy = speedChange * CGFloat(sinf(calcRotation))
let force = SKAction.applyForce(CGVector(dx: Vx, dy: Vy), duration: 0.2)
racecar.run(force)
let total = self.outerTrack.count
var initial = 0
while initial < total {
if racecar.intersects(self.outerTrack[initial]) {
racecar.removeFromParent()
self.numberOfCars -= 1
initial += 1
caralive = false
break
} else {
initial += 1
}
}
} else {
// print(self.numberOfCars)
}
}
}
2D-массив newCar представляет собой список всех инструкций.
Любая помощь будет высоко ценится, поскольку я пытаюсь понять это целую вечность!!
Заранее большое спасибо, любые вопросы просто не стесняйтесь задавать!
1 ответ
Вы должны сделать что-то вроде этого:
func scheduledTimerWithTimeInterval(){
// Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("moveCarsFunction"), userInfo: nil, repeats: true)
}
И позвонить scheduledTimerWithInterval
один раз