【问题标题】:Java Snake Game avoiding using Thread.sleepJava Snake Game 避免使用 Thread.sleep
【发布时间】:2018-03-11 22:24:57
【问题描述】:

我用 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() 更改为其他内容,但我不知道如何以简单的方式做到这一点。 提前感谢您的任何建议。

【问题讨论】:

    标签: java multithreading responsiveness


    【解决方案1】:

    我已经用 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 将在其间触发。

    【讨论】:

      【解决方案2】:

      一个更好的主意是使用上面建议的计时器,它允许您在指定延迟后触发而不调用 sleep()。

      如果你想让它更复杂一点但自制,请启动一个新线程来处理睡眠。 您可以使用一些池频率的池机制来避免 thread.sleep。将您的条件放在 while 循环中,如果条件不满足,则等待一些时间。等待时间应该更短,所以它会以小间隔轮询。

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

      【讨论】:

      • 你不能调用wait而不获取你调用它的对象上的锁。您也应该在答案中包括这一点。 sleep 不需要获取锁,但 wait 需要。
      • 添加了一个同步块,我没有添加,因为我只想突出显示等待部分
      • 好的,下一步。线程正在等待,您能否在答案中判断它是主线程还是任何其他线程。如果它是主线程并且它正在等待响应如何解决?如果它是另一个线程,您在回答中提到它的位置。
      • 这样的系统对用户来说是生涩的。此外,在非多线程系统中获取锁本身是昂贵且不需要的。
      • 您可以使用sleep 实现您的解决方案,即使用睡眠进行轮询。
      猜你喜欢
      • 2012-09-29
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多