Java游戏缓慢更新几秒钟

Java游戏缓慢更新几秒钟,java,game-engine,Java,Game Engine,我正在制作一个克隆(你知道,只是为了好玩),我对更新(tick)方法有点小问题 以下是更新和渲染循环的步骤: while (running) { double nsTick = 1000000000 / amountOfTicks; long now = System.nanoTime(); deltaRender += (now - lastTime) / nsRender; deltaTick += (now - lastTime) / nsTick;

我正在制作一个克隆(你知道,只是为了好玩),我对更新(tick)方法有点小问题

以下是更新和渲染循环的步骤:

while (running) {
    double nsTick = 1000000000 / amountOfTicks;

    long now = System.nanoTime();
    deltaRender += (now - lastTime) / nsRender;
    deltaTick += (now - lastTime) / nsTick;
    lastTime = now;

    while (deltaRender >= 1){
        render();
        frames++;
        deltaRender--;

        if (tickRunning) {
            while(deltaTick >= 1) {
                tick();
                ticks++;
                deltaTick--;
            }
        }

        if (System.currentTimeMillis() - timer > 1000){
            timer += 1000;
            System.out.println("Ticks: " + ticks);
            frames = 0;
            ticks = 0;
        }
    }
}

stop();
正如您所看到的,我已经将渲染和勾选功能分开,因为勾选的速率由用户实时控制

问题是,当游戏开始(或未暂停)时,tick的更新率不稳定几秒钟(大约10秒),然后调整到正确的更新率。这能解决吗


游戏目前运行在一个线程上。

等等,我做了一些不同的工作(也许这就是你的意思)。代码如下:

while(deltaTick >= 1){
   deltaTick--;
   if(tickRunning){
       tick();
       ticks++;         
   }
}

老鼠有时会有点反应迟钝,但我想那是以前的事了。非常感谢

问题似乎是当你暂停游戏时,你仍然在计算你必须执行的
tick()
s(也就是说,
deltaTick
继续增加);当游戏恢复时,会立即执行这些堆叠的
tick()
s。这里有多种解决方案;一种是在游戏暂停时暂停增加的
deltaTick

if (tickRunning) {
    deltaTick += (now - lastTime) / nsTick;
}

另一种方法是,当你继续或开始游戏时,简单地将
deltaTick
设置为
0

你是否故意只在
render()
到期时调用
tick()
?Lazzaro,不是真的,我颠倒了执行顺序,但我看不出有什么大的区别。我也不认为这有问题,只要渲染频率大于更新频率(我想是这样);特别是当不稳定的帧率在一段时间后停止时。这对我来说毫无意义。请注意,我所说的不是执行顺序,而是
if(tickRunning)
while(deltaRender>=1)
循环体中。哦,就是这样。问题是,如果只让它在勾号运行时渲染(我猜这就是你的意思),当游戏暂停时,我将无法与游戏交互(单击单元格)。这就是我这么做的原因。不,我宁愿建议你把它们一个接一个地(按任意顺序)放置,以便它们彼此独立。我认为要让你的答案起作用,它需要不同的now和lastTime变量,因为这些变量在主循环中发生变化,即使tickRunning为false。明天我将研究它,因为它看起来可能是比我的更好的解决方案,因为它运行的次数更少。谢谢事实上(如果我没弄错的话)你不应该这么做。如果您有单独的
now
lastTime
变量用于更新
deltaTick
,并且在游戏暂停时不更新“
lastTimeTick
”;你只需要在那个地方堆积虱子,然后在游戏恢复时将它们一次推到
deltaTick
。我在你建议时尝试过,但没有效果,没有开始时那么糟糕,但有一些口吃。我又看了一遍代码,我不知道为什么,但我认为它与上次更新的方式是一致的。如果你想让它工作,(为了你自己的平静),我可以发送代码。