0

我很难理解一段控制游戏循环的代码......我无法理解这个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;
        }

    }
}
4

2 回答 2

4

该内部 while 循环确保游戏更新基于固定时间,而不是帧时间。未处理的时间被收集起来,一旦它大于一个滴答的时间范围,它就会调用tick().

基本上是计算TickCount滴答声(滴答声时间是 1/60 秒,所以 60 滴答声/秒),一旦经过 1 秒,它就会打印收集的帧(所以 FPS)。此外,ticked表示游戏中的某些内容可能会发生变化,因此需要新的渲染。

于 2013-07-18T13:08:12.407 回答
0

此循环用于在游戏中保持恒定时间。因此,如果由于某种原因出现延迟,您将进行多次逻辑更新和一次渲染。我假设 tick() 执行一些逻辑操作。

更准确地说。例如,你有子弹,子弹位置需要在 0.1s 更新,才能进行正确的碰撞测试。如果由于某种原因增量时间增长到 0.4 秒,您的子弹将穿过墙壁。为了处理它,你用更小的时间步执行了几次迭代,这个循环就是这样做的。

于 2013-07-18T13:12:20.197 回答