#java #multithreading #frame-rate #nanotime
#java #многопоточность #частота кадров #nanotime
Вопрос:
Я следую руководству, и ниже приведен метод run для генерации обновлений логики и фреймов. Я понимаю, как тики обновляются 60 тактов в секунду, но я не понимаю, как мы здесь настраиваем частоту кадров в секунду.
Прямо сейчас с Thread.sleep (2) частота кадров в секунду составляет около 460. Без этого цифры растут, около 10 миллионов обновлений в секунду. Код 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:
Well sleep(2)
вызывается повторно в вашем running
цикле, поэтому жесткий верхний предел в этом случае составляет 500 циклов в секунду (1000 мс, разделенных на 2 мс), и ваши измеренные 460 кадров в секунду довольно близки к этому.
Конечно же, вы можете настроить продолжительность сна в соответствии с вашими потребностями и, при необходимости, включить его в метод несколько более высокой точности Thread#sleep(long, int)
, где вторым параметром является «nanos» (посмотрите на документ для предостережений!).
Формула для вашего случая такова FPS = 1000 ms / sleep duration in ms
. Из чего следует: sleep duration in ms = 1000 ms / FPS
.