Java - Thread.sleep里面的run方法

时间:2014-06-25 09:57:39

标签: java multithreading frame-rate nanotime

我正在学习教程,下面是生成逻辑和帧更新的run方法。我理解滴答是如何更新60滴/秒,但我不明白我们如何调整每秒帧数。

现在使用Thread.sleep(2),每秒帧数大约为460.没有它,数字会逐渐增加,每秒大约1000万次更新。代码Thread.sleep(2)暂停线程仅2毫秒对吗? Thread.sleep为什么/如何在这里正常工作以降低它?

创建一个nsPerFrame = 1000000000D /(FPS)D来设置我想要的FPS方式并不是更简单吗?

public void run(){
    long lastTime = System.nanoTime();
    double nsPerTick = 1000000000D / 60D;

    int frames = 0;
    int ticks = 0;

    long lastTimer = System.currentTimeMillis();
    double delta = 0;

    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / nsPerTick;
        lastTime = now;

        while(delta >= 1){
            ticks++;
            tick();
            delta-= 1;
        }

        try{
            Thread.sleep(2);
        } catch(InterruptedException e){
            e.printStackTrace();
        }

        frames++;
        render();

        if(System.currentTimeMillis() - lastTimer >= 1000){
            lastTimer += 1000;
            System.out.println(ticks + "," + frames);
            frames = 0;
            ticks = 0;
        }
    }
}

1 个答案:

答案 0 :(得分:5)

在你的sleep(2)循环中,running被重复地称为 ,所以在这种情况下硬上限是每秒500个循环(1000毫秒除以2毫秒),你测得的460 fps非常接近。

果然你可以根据你的需要调整睡眠持续时间,如果需要,可以将它填入更高精度的方法Thread#sleep(long, int),其中第二个参数是" nanos" (看看文件中的警告!)。

您的案例的公式为FPS = 1000 ms / sleep duration in ms。从下面开始:sleep duration in ms = 1000 ms / FPS