如何理解每秒帧数

时间:2014-07-17 17:52:21

标签: java

我正在尝试在游戏中实现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());
}

3 个答案:

答案 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迭代一次。