【问题标题】:LWJGL timer not working?LWJGL 定时器不工作?
【发布时间】:2013-06-22 12:48:45
【问题描述】:
我在控制台中不断收到很多“Delta: 0.0”,但很少有几行我收到类似“Delta: 9.999275207519531E-4”的信息,这是怎么回事?
Timer timer = new Timer();
float lastTime = 0.0f;
timer.resume();
while (!Display.isCloseRequested())
{
timer.tick();
System.out.println("Delta: " + (timer.getTime() - lastTime));
lastTime = timer.getTime();
Display.update();
}
Display.destroy();
【问题讨论】:
标签:
java
lwjgl
timedelta
delta
【解决方案1】:
永远不要在游戏循环中使用 java 的 Timer 类。它不够精确,无法可靠使用。相反,请查看this 链接以查看一些用 java 编写的可靠游戏循环。
【解决方案2】:
一个小提示,只是一个警告。你的计时机制有点缺陷。
考虑到此代码在编写时逐行运行,您将“浪费”时间。这个
System.out.println("Delta: " + (timer.getTime() - lastTime));
lastTime = timer.getTime();
代码执行以下操作:
1. 获取当前时间。
2. 做一些数学运算。
3.调用String构造函数。
4. 执行字符串连接。
5. 将当前时间写入lastTime 变量。
请注意,当前时间在 1 和 5 情况下是不同的。这意味着这个时间从“延迟:xx”输出中“丢失”。
如果您继续在代码中使用(timer.getTime() - lastTime) 技术来获取上一次迭代的时间,您肯定会遇到不同的事件认为上一次迭代的时间不同的问题。我建议您使用以下代码进行计时:
private double delta;
private long timing;
public void updateTime()
{
long newTime = System.nanoTime();
this.delta = (newTime - this.timing) / 1_000_000_000.0;
this.timing = newTime;
}
public double getDelta() {
return this.delta;
}
updateTime() 在每个循环中调用一次,getDelta() 则在每次您想要从上一次迭代中经过的时间时调用。