使用robot.moveMouse()时,JavaFX KeyEvents会延迟
我正在尝试用JavaFX编写一些第一人称3D游戏,到目前为止,游戏运行得相当不错 我使用JavaFX的内置shape和PerspectiveCamera类将图像渲染到场景中 但所有关键事件的输入延迟约为1-2秒 滞后仅出现:使用robot.moveMouse()时,JavaFX KeyEvents会延迟,java,javafx,3d,delay,keyevent,Java,Javafx,3d,Delay,Keyevent,我正在尝试用JavaFX编写一些第一人称3D游戏,到目前为止,游戏运行得相当不错 我使用JavaFX的内置shape和PerspectiveCamera类将图像渲染到场景中 但所有关键事件的输入延迟约为1-2秒 滞后仅出现: 一旦程序切换到全屏(即使切换回windowed,它们仍然存在,但在程序刚启动时不会出现) 按下/松开按钮前不久,使用鼠标旋转相机 e、 g:我按W键向前移动,同时移动鼠标。如果我现在释放W,玩家仍然会向前移动1-2秒。 如果不移动鼠标,就不会发生这种情况 这是跟踪输入的
- 一旦程序切换到全屏(即使切换回windowed,它们仍然存在,但在程序刚启动时不会出现)
- 按下/松开按钮前不久,使用鼠标旋转相机
scene.setOnKeyPressed(e -> keyPressed(e));
scene.setOnKeyReleased(e -> keyReleased(e));
和(对于keyreased(e)来说,与“false”相同)
对于相机移动,我使用此功能:
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);”一切正常。此外,如果我通过箭头键控制相机移动,也不会出现延迟
整个游戏循环包含在JavafX的AnimationTimer中,它提供了稳定的帧速率
另一个小观察:由于该项目刚刚启动,有许多小口吃。我一切换到全屏,程序就运行得很平稳(当然,尽管有输入延迟,但鼠标根本没有输入延迟)
如果需要,我可以发布完整的代码,如果问题不够清楚,我可以上传视频。因此我发现在另一个线程中运行整个主/游戏循环可以解决问题。不再有输入滞后,口吃也消失了 如果有人对我的解决方案感兴趣,请参阅: 首先,我将游戏循环中的所有内容打包到一个函数“mainloop()”,大致如下所示:
public void mainloop(){
mouseMovement(); // <- full function is in the question above
updatePosition();
collisionDetection();
}
最后,使用动画计时器调用线程:
new AnimationTimer() {
@Override public void handle(long now) {
t.run();
}
}.start();
我不确定这是否是解决这个问题的有效方法,但它似乎起了作用
Thread t = new Thread() {
public void run() {
Platform.runLater(new Runnable() {
public void run() {
mainloop();}
});
}
};
t.setDaemon(true);
new AnimationTimer() {
@Override public void handle(long now) {
t.run();
}
}.start();