Java蛇游戏避免使用Thread.sleep

时间:2017-06-10 22:16:09

标签: java multithreading responsiveness

我用Java制作了我的第一个游戏 - Snake, 它的主循环看起来像这样

while (true)
    {
        long start = System.nanoTime();
        model.eUpdate();
        if (model.hasElapsedCycle())
        {
            model.updateGame();
        }
        view.refresh();
        long delta = (System.nanoTime() - start) / 1000000L;
        if (delta < model.getFrameTime())
        {
            try
            {
                Thread.sleep(model.getFrameTime() - delta);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

但是在我的项目要求中有一个响应点,所以我需要将Thread.sleep()更改为其他内容,但我不知道如何以简单的方式执行此操作。 提前感谢任何建议。

2 个答案:

答案 0 :(得分:4)

我用Java完成了一两个简单的游戏并处理主游戏循环我使用了Swing Timer。计时器允许您设置ActionListener在提供的delay过后被触发。中间延迟将来自您的帧速率。最基本的用法如下:

Timer timer = new Timer(delay, listener);
timer.start();

这会将初始和中间延迟设置为相同的值。如果需要,您也可以将它们设置为不同的值,如下所示:

Timer timer = new Timer(delay, listener);
timer.setInitialDelay(0);
timer.start();

在上面的示例中,listener将在启动后尽快触发,之后在delay之间触发。

答案 1 :(得分:-1)

更好的想法是使用上面建议的Timer,它允许你在指定的延迟后触发而不调用sleep()。

如果你想要它稍微复杂但是自制的启动一个新线程来处理睡眠。 您可以将池化机制与某些池化频率放在一起,以避免thread.sleep。在while循环中输入您的条件并在条件不满足时等待一些时间。等待时间应该少于等于小间隔轮询。

//more code here It is a sample code
    synchronized(this) {
         while (delta < model.getFrameTime()) {
          this.wait(500);
         }
       //more code