[英]Java - Thread.sleep inside run method
我正在学习一个教程,下面是生成逻辑和帧更新的run方法。 我理解滴答是如何更新60滴/秒,但我不明白我们如何调整每秒帧数。
现在使用Thread.sleep(2),每秒帧数大约为460.没有它,数字会上升,每秒大约1000万次更新。 代码Thread.sleep(2)暂停线程仅2毫秒对吗? Thread.sleep为什么/如何正确地在这里工作以降低它?
是不是更简单的创建一个nsPerFrame = 1000000000D /(FPS)D来设置我想要的方式与刻度线的方式?
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;
}
}
}
在你的running
-loop中重复调用well sleep(2)
,因此在这种情况下硬上限是每秒500个周期(1000 ms除以2 ms),你测得的460 fps非常接近。
果然你可以根据你的需要调整睡眠持续时间,如果需要的话,可以把它填入更高精度的方法Thread#sleep(long, int)
,其中第二个参数是“nanos”(看看文档中的注意事项! )。
你的情况的公式是FPS = 1000 ms / sleep duration in ms
。 从下面开始: sleep duration in ms = 1000 ms / FPS
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.