Ошибка с очередью отправки 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 один раз

первоначально ответил здесь

Другие вопросы по тегам