Java — Thread.sleep внутри метода запуска

#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 .