Java游戏缓慢更新几秒钟
我正在制作一个克隆(你知道,只是为了好玩),我对更新(tick)方法有点小问题 以下是更新和渲染循环的步骤: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;
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
。我在你建议时尝试过,但没有效果,没有开始时那么糟糕,但有一些口吃。我又看了一遍代码,我不知道为什么,但我认为它与上次更新的方式是一致的。如果你想让它工作,(为了你自己的平静),我可以发送代码。