我正在学习一个教程,下面是用于生成逻辑和框架更新的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;
}
}
}
好在-loop中反复sleep(2)
调用,因此这种情况下的硬上限是每秒500个周期(1000 ms除以2 ms),而您测得的460 fps接近于此。running
当然,您可以根据需要调整睡眠时间,如果需要,可以将其填充到精度更高的方法中Thread#sleep(long, int)
,其中第二个参数是“ nanos”(请注意文档中的警告!)。
您的案例的公式是FPS = 1000 ms / sleep duration in ms
。从中得出:sleep duration in ms = 1000 ms / FPS
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句