Как я ограничиваю свой framerate на уровне 60 кадр/с в Java?

С NOT EXISTS:

select distinct a from tablename t
where not exists (
  select 1 from tablename 
  where 
    a = t.a
    and
    c <> 0
)
14
задан ojblass 21 April 2009 в 06:20
поделиться

6 ответов

Вы можете прочитать статью Game Loop . Очень важно, чтобы вы сначала поняли различные методологии игрового цикла, прежде чем пытаться что-либо реализовать.

33
ответ дан 1 December 2019 в 06:02
поделиться

Вот как я это сделал в C ++ ... Я уверен, что вы можете адаптировать его.

void capFrameRate(double fps) {
    static double start = 0, diff, wait;
    wait = 1 / fps;
    diff = glfwGetTime() - start;
    if (diff < wait) {
        glfwSleep(wait - diff);
    }
    start = glfwGetTime();
}

Просто позвоните это с capFrameRate (60) один раз за цикл. Он будет спать, чтобы не тратить драгоценные циклы. glfwGetTime () возвращает время с момента запуска программы в секундах ... Я уверен, что где-нибудь в Java можно найти эквивалент.

4
ответ дан 1 December 2019 в 06:02
поделиться

Мьютекс - это в основном взаимное исключение. Только один поток может получить ресурс одновременно. Когда один поток получает ресурс, никакому другому потоку не разрешается получать ресурс, пока поток, владеющий ресурсом, не освободится. Все потоки, ожидающие получения ресурса, будут заблокированы.

Семафор используется для управления количеством выполняемых потоков. Там будет фиксированный набор ресурсов. Количество ресурсов будет уменьшаться каждый раз, когда потоку принадлежит один и тот же. Когда счетчик семафоров достигает 0, другие потоки не могут получить ресурс. Потоки блокируются до тех пор, пока другие потоки не получат освобождение ресурса.

Короче говоря, основное отличие заключается в , сколько потоков может получить ресурс одновременно?

  • Mutex - это ОДИН.
  • Семафор - - его DEFINED_COUNT,
5
ответ дан 1 December 2019 в 06:02
поделиться

Я просто продолжил цикл и отслеживал, когда я последний раз делал анимацию. Если это было не менее 17 мс, пройдите по последовательности анимации.

Таким образом, я мог бы проверить любые вводимые пользователем данные и включить / выключить музыкальные ноты по мере необходимости.

Но это было в программе, чтобы помочь учите детей музыке, и мое приложение перегружало компьютер тем, что было полноэкранным режимом, поэтому оно плохо работало с другими.

0
ответ дан 1 December 2019 в 06:02
поделиться

В java вы можете выполнить System.currentTimeMillis () , чтобы получить время в миллисекундах вместо glfwGetTime () .

Thread.sleep (время в миллисекундах) заставляет поток ждать, если вы не знаете, и он должен быть в пределах блока try .

0
ответ дан 1 December 2019 в 06:02
поделиться

Если вы используете Java Swing, самый простой способ добиться 60 кадров в секунду — настроить javax.swing. Такой таймер является обычным способом создания игр:

public static int DELAY = 1000/60;

Timer timer = new Timer(DELAY,new ActionListener() {
    public void actionPerformed(ActionEvent event) 
    {
      updateModel();
      repaintScreen();
    }
});

И где-то в вашем коде вы должны установить этот таймер, чтобы он повторялся и запускал его:

timer.setRepeats(true);
timer.start();

Каждая секунда имеет 1000 мс, и, разделив это на ваш fps (60) и установив таймер с этой задержкой (1000/60 = 16 мс с округлением в меньшую сторону), вы получите несколько фиксированную частоту кадров. Я говорю «в некоторой степени», потому что это сильно зависит от того, что вы делаете в вызовах updateModel() и repaintScreen() выше.

Чтобы получить более предсказуемые результаты, попробуйте синхронизировать два вызова в таймере и убедитесь, что они завершаются в течение 16 мс, чтобы поддерживать 60 кадров в секунду. С умным предварительным выделением памяти, повторным использованием объектов и другими вещами вы также можете уменьшить влияние сборщика мусора. Но это к другому вопросу.

0
ответ дан 1 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: