我正在制作一个game of life克隆,(你知道,只是为了好玩)而且我对更新(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秒)具有不稳定的更新速率,然后调整到正确的更新速率。可以修复吗?
游戏目前在一个线程上运行。
答案 0 :(得分:1)
问题似乎是当你暂停游戏时,你仍在计算你必须执行的tick()
(即deltaTick
继续增加);并且当游戏恢复时,这些堆积的tick()
不会立即被执行。这里有多种解决方案;当游戏暂停时,一个是暂停增加deltaTick
:
if (tickRunning) {
deltaTick += (now - lastTime) / nsTick;
}
另一种方法是在恢复或开始游戏时简单地将deltaTick
设置为0
。
答案 1 :(得分:0)
等等,我做了一些不同的工作(也许这就是你的意思)。这是代码:
while(deltaTick >= 1){
deltaTick--;
if(tickRunning){
tick();
ticks++;
}
}
从时间上来看,鼠标有点反应迟钝,但我认为之前有过。非常感谢!