Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用robot.moveMouse()时,JavaFX KeyEvents会延迟_Java_Javafx_3d_Delay_Keyevent - Fatal编程技术网

使用robot.moveMouse()时,JavaFX KeyEvents会延迟

使用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秒。 如果不移动鼠标,就不会发生这种情况 这是跟踪输入的

我正在尝试用JavaFX编写一些第一人称3D游戏,到目前为止,游戏运行得相当不错

我使用JavaFX的内置shape和PerspectiveCamera类将图像渲染到场景中

但所有关键事件的输入延迟约为1-2秒

滞后仅出现:

  • 一旦程序切换到全屏(即使切换回windowed,它们仍然存在,但在程序刚启动时不会出现)

  • 按下/松开按钮前不久,使用鼠标旋转相机

e、 g:我按W键向前移动,同时移动鼠标。如果我现在释放W,玩家仍然会向前移动1-2秒。 如果不移动鼠标,就不会发生这种情况

这是跟踪输入的方式:

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();