有关在global和main上使用DispatchQueue和while循环的建议

时间:2017-12-16 21:11:49

标签: swift sprite-kit grand-central-dispatch swift4 gameplay-kit

我已经制作了一款策略游戏并为其实施了游戏套装AI。人工智能每回合可能需要多次动作。由于GKMinMaxStrategist为每次调用提供了最佳移动,因此我将方法bestMoveForPlayer()置于tileForAIMove()内的while循环中。

我看到的每个实现都将该方法放在DispatchQueue.global()单独的线程中,所以我尝试匹配它。要实际执行移动,需要更改映射,因此我在主线程上执行它。不幸的是,这会导致导致BAD ACCESS错误的奇怪行为,因为while循环可以在主线程执行上一次移动之前在全局线程内执行多次。

我尝试了几种变体,但此时无法弄清楚如何在这里有效地使用线程。这是我目前的代码:

func startAIMove() {
    DispatchQueue.global().async {[unowned self] in
        let strategistTime = CFAbsoluteTimeGetCurrent()

        var timeCieling = 2.0
        while let move = self.tileForAIMove() {
            DispatchQueue.main.async {[unowned self] in
                self.makeAIMove(with: move.tile, position: move.position)
                //Keep going until all the moves for this possible turn are made.
                self.checkForPlayerLosing()

                if let currentPlayer = self.gameModel!.activePlayer! as? Player {
                    if currentPlayer.availableLevel3! + currentPlayer.availableLevel2! + currentPlayer.availableLevel1! + currentPlayer.availableCounters! == 0{
                        //No valid moves left so we transition to next player.
                        DispatchQueue.main.asyncAfter(deadline: .now() + timeCieling){ [unowned self] in
                            print("EndTurn \(self.gameModel!.activePlayer!.playerId)")
                            self.advanceTurnToNextPlayer()
                        }
                    }
                }
            }
        }
    }
}

基本上我要问的是,我怎么能更好地使这个线程代码。

谢谢!

0 个答案:

没有答案