Как правильно реализовать многопоточность при использовании игрового цикла

#java #multithreading #swing #game-loop

#java #многопоточность #swing #игровой цикл

Вопрос:

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

 private void runGameLoop() {
        window.setVisible();
        isRunning = true;
        final double FRAMES_PER_SECOND = 60;
        double timePerUpdate = 1000000000 / FRAMES_PER_SECOND;
        double timeFromLastUpdate = 0;
        long now;
        long last = System.nanoTime();
        while (isRunning) {
            now = System.nanoTime();
            timeFromLastUpdate  = (now - last) / timePerUpdate;
            last = now;
            if(timeFromLastUpdate >= 1) {
                tick();
                render();
                timeFromLastUpdate--;
            }
        }
    }
  

Метод tick обновляет местоположение изображения автомобиля, а метод render отображает изображение (с новым местоположением) на экране.
Я хочу, чтобы вычисления для нового местоположения изображения выполнялись в отдельном потоке, потому что на данный момент вычисления занимают много времени и вызывают задержку рендеринга. Есть ли способ использовать многопоточность при одновременной реализации игрового цикла?
Заранее спасибо.

Комментарии:

1. Нет, это swing-приложение

2. Параллелизм в Swing и как использовать таймеры Swing

Ответ №1:

Возможно, вы можете сделать что-то похожее на то, что делает Android. В Android есть основной поток, который будет похож на ваш игровой цикл. У него есть обработчик для исполняемых файлов, которые отправляются из фоновых / параллельных потоков в основной поток.

Таким образом, при каждом цикле цикла mainthread выполняет любые выполняемые файлы, размещенные в фоновых потоках feom.

Обратите внимание, что вычисления не должны выполняться в исполняемых файлах (которые выполняются в mainthread), в исполняемых файлах должна выполняться только передача результатов / обновление.