在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.不确定这里发生了什么。
答案 0 :(得分:0)
LWJGL 2还是3?真的不重要..
虽然,据我所知,在其他线程上调用此方法不应该有问题,尽管在OpenGL上下文绑定的Thread上调用它是一个好主意。< / p>
对于我的设置,我有一个专用于所有OpenGL上下文相关内容的线程。 (例如openGL调用)。所以在你的情况下,Il会检查图形Thread中的keyPressed状态,它会将一个提示传递给物理线程,它会完成所有的重物(如果有的话)。虽然细节当然取决于您。
我希望这有助于你
修改强>
在处理这个问题时我遇到了this post,基本上由于LWJGL的设计选择,它是不可能的。您可以通过提示手动分离它(如上所述),或者跟踪您从其他线程检查的每个输入设备的状态(在图形线程中更新),而不是使用{{1}}类。