2017-01-19 6 views
-1

В игре 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. Не уверен, что здесь происходит.

+0

Где вы проводите опрос/дожидаетесь событий на клавиатуре? Или вы проверяете только определенные нажатые клавиши во время игры? – n247s

+0

В настоящее время только проверка нажатых клавиш в каждой игре – DestinySpork

ответ

0

LWJGL 2 или 3? Должно быть, это действительно важно.

хотя, насколько я знаю, не должно быть проблем с вызовом этого метода на других Threads, хотя Вызов его в потоке, где привязан контекст OpenGL, является хорошей идеей.

Для моей установки у меня есть одна тема, посвященная всем связанным с OpenGL материалам. (Например, только вызовы openGL). Таким образом, в вашем случае, Il будет проверять состояние KeyPressed в графическом потоке, который передает намек на физическую нить, которая выполняет весь тяжелый подъем (если таковой имеется). Конечно, все зависит от вас.

Я надеюсь, что это поможет вам

Edit:
я наткнулся this post при решении этой проблемы, а также, в основном ее не представляется возможным из-за выбора дизайна по LWJGL. Вы можете вручную отделить его, указав (как описано выше) или отслеживать состояние каждого устройства ввода (обновленного в графическом потоке), которое вы проверяете, из других потоков, вместо использования класса Keyboards.