我正在尝试在游戏中实现fps,但我不明白我发现的这段代码背后的逻辑。三角洲的重点是什么,以及它大于1的事实?为什么我要减去1?
public void run() {
long lastTime = System.nanoTime();
double nsPerTick = 1000000000D / 60D; // how many nanoseconds per tick
int frames = 0;
int ticks = 0;
long lastTimer = System.currentTimeMillis();
double delta = 0; // unprocessed nanoseconds.
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / nsPerTick; //current time - lasttime
lastTime = now;
while(delta >= 1){
ticks++;
tick();
delta -= 1;
}
frames++;
render();
if (System.currentTimeMillis() - lastTimer >= 1000){
lastTimer += 1000;
System.out.println(frames + " " + ticks);
frames = 0;
ticks = 0;
}
}
}
替代方案:第一种方法是否优于http://gameprogrammingpatterns.com/game-loop.html中的第二种方法?
while (true)
{
double start = getCurrentTime();
processInput();
update();
render();
sleep(start + MS_PER_FRAME - getCurrentTime());
}
答案 0 :(得分:2)
基本思想是在渲染之间传递的每1/60秒代表一个刻度:
while (delta >= 1){
ticks++;
tick();
delta -= 1 ;
}
此循环将完全delta
次运行(正如代码中的注释所示,最初表示已经过了多少纳秒,但nsPerTick
的除法转换为1/60秒) 。因此,如果delta
等于5,则tick()
函数将运行五次。这就是全部。
如果你能理解的话,你可以像这样重写一下:
for(int i=0;i<delta;i++) {
tick(); //run this once per 1/60th second between frames
}
ticks = delta; //...and set 'ticks' equal to that number of 1/60th seconds
答案 1 :(得分:0)
nsPerTick是帧的频率 1 / nsPerTick是句号。
Delta是期间* timePassed。只有在完成一个句点(这意味着delta&gt; = 1)之后,您才应该渲染下一帧。
然后从delta中减去1,因为你想知道何时渲染下一帧。
答案 2 :(得分:0)
delta
是数学中用来表示变化的希腊符号。
now
是客观时间,即不是时间,而是实际时间,例如2011年1月2日下午2:23:01:00。
delta
衡量经过的时间在now
之间,即父级while循环执行单独迭代的时间,以及变量{{1}的内容这实际上是while循环的之前迭代的lastTime
。
如果两次迭代之间的时间差大于1,那么你的第二个while循环将为你的now
的每个整数 over 1迭代一次。