我正在尝试创建一种遗传算法,用于在赛道上运行赛车。每辆汽车都会收到随机指令,这些指令会向汽车施加力并将汽车旋转一定的度数。为了将分配给每辆车的新指令间隔开,我在调度队列中使用了一个延迟时间,它在前一条指令的基础上增加了 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)
}
}
}
二维数组 newCar 是所有指令的列表。
任何帮助将不胜感激,因为我多年来一直试图解决这个问题!
非常感谢提前,任何问题都可以随时提出!