游戏循环控制

时间:2013-07-18 13:02:40

标签: java java-3d

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

    }
}

2 个答案:

答案 0 :(得分:4)

内部循环确保游戏更新基于固定时间而非帧时间。未经处理的时间正在被收集,一旦它超过一个时间戳的时间范围,它就会调用tick()

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

答案 1 :(得分:0)

此循环用于在游戏中保持恒定时间。因此,如果由于某种原因你得到滞后,你将做几个逻辑更新和一个渲染。我假设tick()执行一些逻辑运算。

更准确。例如,你有子弹,子弹位置需要在0.1秒更新,以进行适当的碰撞测试。如果由于某种原因增量时间增加到0.4秒,你的子弹将飞过墙壁。为了处理它,你用较小的时间步进行几次迭代,这个循环就是这样做的。