В игре LWJGL у меня есть 3 потока - один для графики, один для обработки/физики и один для обеспечения доступа в мир и взаимодействия с многопользовательскими соединениями. Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю Keyboard.isKeyDown() в физическом потоке, мне приходится удерживать ее на полсекунды или около того, прежде чем что-нибудь случится. Это происходит не потому, что поток работает медленно - это единственная вещь в цикле на данный момент, а вызов println показывает, что он обновляется. Мне интересно, связано ли это с тем, что контекст OpenGL существует в графическом потоке, и я вызываю вызовы клавиатуры из физического потока? Если я делаю чек в графическом потоке, он отлично работает, но входы туда и отправка их в другой поток несколько бросают вызов точке с отдельными потоками.Многопотоковая задержка клавиатуры LWJGL
Моя проверка клавиатуры в настоящее время выглядит следующим образом:
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. Не уверен, что здесь происходит.
Где вы проводите опрос/дожидаетесь событий на клавиатуре? Или вы проверяете только определенные нажатые клавиши во время игры? – n247s
В настоящее время только проверка нажатых клавиш в каждой игре – DestinySpork