我很难理解控制游戏循环的一段代码...我无法理解这个while循环的目的“while(unprocessedSeconds> secondsForEachTick)”以及为什么FPS计数器如果内部的if(tickCounter%60 == 0),如下代码:
public void run()
{
int frames = 0;
double unprocessedSeconds = 0;
long previousTime = System.nanoTime();
double secondsForEachTick = 1/60.0;
int tickCount = 0; //RENDER COUNTER
boolean ticked = false;
while (running)
{
long currentTime = System.nanoTime();
long passedTime = currentTime - previousTime;
previousTime = currentTime;
unprocessedSeconds = unprocessedSeconds + passedTime / 1000000000.0;
int count = 0;
while(unprocessedSeconds > secondsForEachTick)
{
tick();
count++;
unprocessedSeconds -= secondsForEachTick;
ticked = true;
tickCount++;
if(tickCount % 60 == 0){
System.out.println(frames + " fps");
previousTime += 1000;
frames = 0;
}
}
System.out.println("Iterações do loop: "+count);
if(ticked)
{
render();
frames++;
ticked = false;
}
}
}
答案 0 :(得分:4)
内部循环确保游戏更新基于固定时间而非帧时间。未经处理的时间正在被收集,一旦它超过一个时间戳的时间范围,它就会调用tick()
。
TickCount
基本上计算滴答声(滴答时间是1/60秒,所以60滴/秒),并且一旦经过1秒,它就会打印收集的帧(所以FPS)。此外,ticked
表示游戏中的某些内容可能会发生变化,因此需要新的渲染。
答案 1 :(得分:0)
此循环用于在游戏中保持恒定时间。因此,如果由于某种原因你得到滞后,你将做几个逻辑更新和一个渲染。我假设tick()执行一些逻辑运算。
更准确。例如,你有子弹,子弹位置需要在0.1秒更新,以进行适当的碰撞测试。如果由于某种原因增量时间增加到0.4秒,你的子弹将飞过墙壁。为了处理它,你用较小的时间步进行几次迭代,这个循环就是这样做的。