我目前正在用java清理我的游戏循环计时,但是我在纳秒到秒的转换方面遇到了一个非常奇怪的问题。
出于某种原因,当我不写入控制台时,将纳秒传递到时间增量(以秒为单位)除以 100,000,000 即可正常工作。鉴于每秒有 1000,000,000 纳秒,我立即发现这很奇怪,所以我尝试测量每秒运行了多少循环,并在它飞到我需要的 FPS 之上时将其打印到控制台。由于一个完全未知的原因,这导致游戏异常减速,需要除以 1000,000,000 才能使 delta 达到其正确值。我完全不知道为什么会这样。
下面是当前的循环。注释掉的“问题触发器”行会改变“问题行”的功能,导致需要更改其除以的值以将其转换为正确的单位
while (isRunning)
{
now = System.nanoTime();
delta = (double)(now - lastUpdateTime) / 1000000000; //problem line
timer += delta;
timerplus += delta;
ticks++;
gamePanel.Update(delta);
lastUpdateTime = System.nanoTime();
if (ticks / timerplus > 60)
{
System.out.println("fast"); //problem trigger?
}
gamePanel.Render(delta);
timer = 0;
}
任何和所有帮助将不胜感激,这只是一个简单的令人困惑的问题,如果信息是我正在使用的任何帮助,JPanel
并且JFrame
在未修改的 Eclipse IDE 中编写和编译。
编辑:好的,所以在尝试了该代码之后(我所做的只是移动了一些东西)作为三重检查,我回到了问题发生时的布局方式
while (isRunning)
{
now = System.nanoTime();
delta = (double)(now - lastUpdateTime) / 1000000000;
timer += delta;
timerplus += delta;
ticks++;
gamePanel.Update(delta);
lastUpdateTime = System.nanoTime();
if (ticks / timerplus > 120)
{
//System.out.println("wow");
}
if (timer >= (double)1 / TICKS_PER_SECOND)
{
gamePanel.Render(delta);
timer = 0;
}
if (timerplus >= 1)
{
System.out.println("FPS: " + ticks);
ticks = 0;
timerplus = 0;
}
}
现在它们的运行方式不同,具体取决于“哇”行是否被注释掉,仍然非常奇怪,但考虑到我第一次发布的清理版本和我刚刚发布的奇怪的粗壮版本的差异,希望问题更容易发现。