【问题标题】:iMac freezes after while loopiMac 在 while 循环后冻结
【发布时间】:2017-10-20 09:35:55
【问题描述】:

我正在 xcode 中创建游戏。获胜者将获得负分或 0。一切顺利,但现在我希望将这些负分添加到他/她的对手身上。我使用了这段代码:

while (activePlayer.score < 0) {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                    self.activePlayer.score += 1
                    self.activePlayer.scoreLabel.text = String (self.activePlayer.score)
                    self.notActivePlayer.score += 1
                    self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score)
                }
            }

当我现在运行模拟器时,它会在这部分冻结。最糟糕的是我的整个 iMac 死机了。它变得非常缓慢,我不得不等待大约 10 分钟才能关闭模拟器并恢复一些速度。

我的简单结论是这段代码是错误的。但为什么? 我想让玩家看到分数的变化,这就是为什么标签文本会在每个分数添加到分数后更新。

【问题讨论】:

    标签: swift sprite-kit ios-simulator


    【解决方案1】:

    你的 while 循环在那里是一个非常糟糕的主意。您希望它做什么?在第一次迭代中,您安排一个 asnyc 任务,然后迭代完成并安排下一个任务,等等。
    在循环运行的第一瞬间,您将安排数千个异步任务。

    如果您想为更改设置动画,您应该通过在第一个任务完成后安排下一个任务来实现。以下是这样做的一般方法,我没有在 Playground 中运行它:

    func schedule() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            self.activePlayer.score += 1
            self.activePlayer.scoreLabel.text = String (self.activePlayer.score)
            self.notActivePlayer.score += 1
            self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score)
            if (activePlayer.score < 0) {
                self.schedule()
            }
        }
    }
    

    正如 Whirlwind 正确指出的那样,在 sprite-kit 中使用 dispatch 可以让您摆脱当前的游戏循环。您可以通过 SKActions 执行相同的操作,并在完成后重复创建新操作。

    【讨论】:

    • 除了那个不幸的循环 :) 在 SpriteKit 中使用 dispatch_xyz 方法对于时间相关的任务来说仍然不是一个好主意,因为这些没有与游戏循环配对并且你不知道在哪一点他们可能会执行。 SKActions 是一种方法。
    • @Whirlwind 你是绝对正确的。我什至没有意识到 sprite-kit 在这里被使用。我将尝试添加一些内容来澄清这一点。
    • @luk2302 感谢您的帮助。我期望它做的是:只要分数是负数,就加 1 分并显示新的分数,稍等片刻(这样玩家就可以看到变化),必要时再加一分。我试过你的代码,但它只执行了一次 add 1 过程。我现在还将研究 SKAction.wait 过程。我试过了,但没有明显的等待。我必须回到绘图板上。
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多