我在理解控制游戏循环的一段代码时遇到了巨大的困难...我无法理解这个 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;
}
}
}
最佳答案
内部的 while 循环确保游戏更新基于固定时间,而不是帧时间。未处理的时间正在被收集,一旦它大于一个刻度的时间范围,它就会调用 tick()
。
TickCount
基本上是计算滴答数(滴答时间为 1/60 秒,因此 60 滴答/秒),并且一旦 1 秒过去,它就会打印收集的帧(因此 FPS )。此外,勾选
表示游戏中可能会发生某些变化,因此需要新的渲染。
关于java - 游戏循环控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724227/