Я пытаюсь написать какую-то трехмерную 3D-игру первого лица в JavaFX, и пока движение работает довольно хорошо.JavaFX KeyEvents задерживаются при использовании robot.moveMouse()
Я использую встроенные формы JavaFX и классы PerspectiveCamera для рендеринга изображения на сцену.
Но для всех ключевых событий есть интервал времени около 1-2 секунд.
лаги появляются только:
раз программа переключается на полный экран (даже если переключен обратно в оконном они все еще там, но не тогда, когда программа только началась)
и камера поворачивается при помощи мыши незадолго до нажатия/отпускания кнопки
например: Я нажимаю W для перемещения вперед и одновременно перемещения мыши. Если я выпущу W, игрок все равно будет двигаться вперед на 1-2 секунды. Не перемещая мышь, этого не происходит.
Это, как отслеживается вход:
scene.setOnKeyPressed(e -> keyPressed(e));
scene.setOnKeyReleased(e -> keyReleased(e));
и (для keyReleased (е) это же просто с «ложным»)
private void keyPressed(KeyEvent e) {
if (e.getCode().toString() == "W") w = true;
if (e.getCode().toString() == "A") a = true;
if (e.getCode().toString() == "S") s = true;
if (e.getCode().toString() == "D") d = true;
}
Для движения камеры я использовать эту функцию :
private void mouseMovement(){
if(primaryStage.isFocused()){
mxdelta = MouseInfo.getPointerInfo().getLocation().getX() - centerx;
mydelta = MouseInfo.getPointerInfo().getLocation().getY() - centery;
// Rotate Camera
cry += mxdelta * sens; // cry = camera rotation around y-axis
crx -= mydelta * sens; // crx = camera rotation around x-axis
// move curser back to the center of the screen
robot.mouseMove(centerx, centery);
}
}
Если удалить "robot.mouseMove (CenterX, centery);" все работает нормально. Также, если я управляю движением камеры с помощью клавиш со стрелками, также нет лаг.
Весь игровой цикл упакован в AnimationTimer JavafX, который дает стабильную частоту кадров.
Еще одно небольшое наблюдение: по мере того, как программа только запускается, существует множество мелких заиканий. Как только я переключаюсь на полноэкранный режим, программа работает масляно-гладкой (несмотря на входную задержку, конечно, но у мыши нет никакого входного запаздывания).
Я могу опубликовать полный код при необходимости или загрузить видео, если проблема недостаточно ясна.