在Java游戏中计算FPS

时间:2013-12-25 06:32:22

标签: java frame-rate

昨天我写了一篇关于我的游戏循环如何运行的线程(在java中)以及它是如何工作的。

我的游戏循环完全正常,我知道为什么,但现在我只是不知道如何计算FPS(每秒帧数)并每秒打印出来。

我昨天得到了一个回复,但是他/她用语言解释了我无法理解。

如果有人能帮助我(使用代码示例?:D)那就太棒了。

这是我的游戏循环:

        while (running) {

        start = System.nanoTime();

        update();
        draw();
        drawToScreen();

        elapsed = System.nanoTime() - start;

        wait = targetTime - elapsed / 1000000;
        if (wait < 0) {
            wait = 5;
        }

        try {
            Thread.sleep(wait);
        } catch (Exception e) {
            Game.logger.log("ERROR! Printing Stacktrace...");

            e.printStackTrace();
        }

    }

ALSO:

在我的JFrame中,当我调用setName(string)时,它永远不会在Frame上工作/更新 - 将我链接到一个线程?

2 个答案:

答案 0 :(得分:2)

您可以将简单的计数器和Timer.scheduleAtFixedRate结合使用。

免责声明:我不知道这是不是最好的方法;这很简单。

int totalFrameCount = 0;
TimerTask updateFPS = new TimerTask() {
    public void run() {
        // display current totalFrameCount - previous,
        // OR
        // display current totalFrameCount, then set
        totalFrameCount = 0;
    }
}

Timer t = new Timer();
t.scheduleAtFixedRate(updateFPS, 1000, 1000);

while (running) {
    // your code
    totalFrameCount++;
}

答案 1 :(得分:2)

最简单的方法是保存变量whatTheLastTimeWas并在您要检查帧速率的位置执行此操作:

double fps = 1000000.0 / (lastTime - (lastTime = System.nanoTime())); //This way, lastTime is assigned and used at the same time.

或者,您可以像这样制作FPS计数器:

class FPSCounter extends Thread{
    private long lastTime;
    private double fps; //could be int or long for integer values

    public void run(){
        while (true){//lazy me, add a condition for an finishable thread
            lastTime = System.nanoTime();
            try{
                Thread.sleep(1000); // longer than one frame
            }
            catch (InterruptedException e){

            }
            fps = 1000000000.0 / (System.nanoTime() - lastTime); //one second(nano) divided by amount of time it takes for one frame to finish
            lastTime = System.nanoTime();
        }
    }
    public double fps(){
        return fps;
    } 
}

然后在你的游戏中,有一个FPSCounter的实例,并在一帧结束时调用nameOfInstance.interrupt();