【问题标题】:Multithreaded LWJGL Keyboard Delay多线程 LWJGL 键盘延迟
【发布时间】:2017-01-19 21:19:23
【问题描述】:

在我制作的 LWJGL 游戏中,我有 3 个线程 - 一个用于图形,一个用于处理/物理,一个用于提供世界访问和处理多人连接。 我遇到的问题是,当我在物理线程中调用 Keyboard.isKeyDown() 时,有时我必须按住它半秒左右才能发生任何事情。这不是因为线程运行缓慢 - 它是目前循环中唯一的东西,并且 println 调用表明它正在更新。 我想知道这是否与图形线程中存在OpenGL上下文并且我从物理线程调用键盘调用这一事实有关?如果我在图形线程中进行检查,它可以正常工作,但是在那里接受输入并将它们发送到另一个线程会有点违背拥有单独线程的意义。

我的键盘检查目前如下所示:

boolean escPressed = false;
private void process(){
    if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
        if(!escPressed){
            escPressed = true;
            GameStateManager.pauseUnpause();
        }
    }
    else{
        escPressed = false;
    }
}

我的线程设置就是这样

public class Client {

    public static GraphicsThread graphics;
    public static PhysicsThread physics;
    public static ConnectionThread server;

    public static void main(String[] args) {
        GameStateManager.setState(GameStateManager.EnumState.MENU);
        graphics = new GraphicsThread();
        physics = new PhysicsThread();
        server = new ConnectionThread();


        physics.start();
        graphics.start();
        server.start();
    }

}

那么谁能告诉我为什么从不同的线程调用该方法时会出现延迟?

更新 我做了一个快速测试,任何对键盘的调用似乎都需要很长时间才能完成。

while(true){
    start = System.currentTimeMillis();
    Keyboard.isKeyDown(Keyboard.KEY_ESCAPE);
    end = System.currentTimeMillis();
    System.out.println(end-start);
}

运行该测试显示结果高达 1100 毫秒,这高得离谱。在图形线程中运行时,它会在不到一毫秒的时间内完成并打印 0。不确定这里发生了什么。

【问题讨论】:

  • 您在哪里轮询/等待键盘事件?还是您只在游戏滴答期间检查某些按键?
  • 目前只检查每个游戏时间点的按键

标签: java multithreading opengl keyboard lwjgl


【解决方案1】:

LWJGL 2 还是 3?应该不重要..

不过,据我所知,在其他线程上调用此方法应该没有问题,尽管在 OpenGL 上下文绑定到的线程上调用它无论如何都是一个好主意。

对于我的设置,我有一个专用于所有 OpenGL 上下文相关内容的线程。 (例如,仅限 openGL 调用)。因此,在您的情况下,Il 将检查图形线程中的 keyPressed 状态,该状态将提示传递给执行所有繁重工作的物理线程(如果有的话)。虽然细节当然取决于你。

希望对你有帮助

编辑:
我在处理这个问题时也遇到了this post,基本上这是不可能的,因为 LWJGL 选择了设计。您可以通过提示手动分离它(如上所述),或者跟踪您从其他线程检查的每个输入设备的状态(在图形线程中更新),而不是使用Keyboards 类。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2012-12-27
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多