【发布时间】: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