Java 贪吃蛇游戏避免使用 Thread.sleep
Java Snake Game avoiding using Thread.sleep
我在 Java 制作了我的第一款游戏 - 贪吃蛇,
它的主循环看起来像这样
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()
更改为其他内容,但我不知道如何以简单的方式执行此操作。
在此先感谢您的任何建议。
一个更好的主意是使用上面建议的计时器,它允许您在指定的延迟后触发而无需调用 sleep()。
如果你想让它更复杂一点但自制启动一个新的线程来处理睡眠。
您可以将池化机制设置为一定的池化频率,以避免 thread.sleep.Put 您在 while 循环中的条件,如果条件不是 met.And 则等待一些时间应该更少,因此它将以较小的间隔进行轮询。
//more code here It is a sample code
synchronized(this) {
while (delta < model.getFrameTime()) {
this.wait(500);
}
//more code
我用 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
。
我在 Java 制作了我的第一款游戏 - 贪吃蛇, 它的主循环看起来像这样
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()
更改为其他内容,但我不知道如何以简单的方式执行此操作。
在此先感谢您的任何建议。
一个更好的主意是使用上面建议的计时器,它允许您在指定的延迟后触发而无需调用 sleep()。
如果你想让它更复杂一点但自制启动一个新的线程来处理睡眠。 您可以将池化机制设置为一定的池化频率,以避免 thread.sleep.Put 您在 while 循环中的条件,如果条件不是 met.And 则等待一些时间应该更少,因此它将以较小的间隔进行轮询。
//more code here It is a sample code
synchronized(this) {
while (delta < model.getFrameTime()) {
this.wait(500);
}
//more code
我用 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
。