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