Java-Thread.sleep内部运行方法

Java-Thread.sleep内部运行方法,java,multithreading,frame-rate,nanotime,Java,Multithreading,Frame Rate,Nanotime,我正在学习一个教程,下面是生成逻辑和帧更新的run方法。我知道滴答声是如何每秒更新60滴答声的,但我不知道我们如何调整每秒帧数 现在使用Thread.sleep(2),每秒帧数约为460。如果没有它,数字会上升,大约每秒1000万次更新。代码Thread.sleep(2)只挂起线程2毫秒,对吗?Thread.sleep为什么/如何在这里工作,从而将其降到如此低的位置 创建一个nsPerFrame=1000000000D/(FPS)D来设置我想要的任何FPS不是更简单吗,就像他用记号做的那样 pu

我正在学习一个教程,下面是生成逻辑和帧更新的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;
        }
    }
}
好的,
sleep(2)
在您运行的
循环中被反复调用,因此在这种情况下,硬上限是每秒500个循环(1000毫秒除以2毫秒),而您测得的460 fps与此非常接近

当然,您可以根据需要调整睡眠持续时间,如果需要,可以将其填入精度稍高的方法
Thread#sleep(long,int)
,其中第二个参数是“nanos”(查看docu以了解注意事项!)

您的情况下的公式是
FPS=1000 ms/睡眠持续时间,单位为ms
。如下所示:
睡眠持续时间,单位为ms=1000 ms/FPS