2014-09-14 2 views
2

Я начинаю играть с LWJGL. Я взял this sample code, который отлично работает. Затем я хотел изменить способ остановки цикла. Вот мой новый код для цикла «while»:LWJGL «Недопустимый доступ к памяти для местоположения» при использовании исключений

while (true) { 
     // Clear the screen and depth buffer 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

     // set the color of the quad (R,G,B,A) 
     GL11.glColor3f(0.5f,0.5f,1.0f); 

     // draw quad 
     GL11.glBegin(GL11.GL_QUADS); 
      GL11.glVertex2f(100,100); 
     GL11.glVertex2f(100+200,100); 
     GL11.glVertex2f(100+200,100+200); 
     GL11.glVertex2f(100,100+200); 
     GL11.glEnd(); 

     Display.update(); 

     if(Display.isCloseRequested()) { 
      Display.destroy(); 
      throw new Exception("Normal termination"); 
     } 
    } 

На этот раз исключение выбрасывается из цикла. Метод «запуск» бросает исключение, и мой «главный» выглядит следующим образом:

public static void main(String[] argv) { 
     QuadExample quadExample = new QuadExample(); 
     try { 
      quadExample.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

С этой новой структурой, программа вылетает с ошибкой:

Invalid memory access of location 0x0 rip=0x7fff86d8cf0c 

вместо завершения должным образом, когда я закрываю Это.

Для получения информации, я запускаю это на Mac OS X 10.6.7 с JavaSE-1.6. Я видел аналогичный вопрос here и пробовал с -Xint. Это решает проблему. Любая идея, что может пойти не так, без -Xint?

+0

Не уверен, но, скорее всего, некоторая оптимизация компилятором пошла не так. Я не смог найти достоверную информацию о том, как java оптимизируется для скорости (прогнозирование ветвей или ранняя выборка данных). Но это показывает, что использование исключений там, где это действительно не нужно является субоптимальным дизайном. – Dawnkeeper

+0

Я согласен с тем, что дизайн не самый лучший, но это то, что мне нужно, если я хочу интегрировать LWJGL в качестве графического бэкэнда для игрового движка, который у меня уже есть без глубоких изменений в коде игрового движка. – sunmat

ответ

0

Я до сих пор не знаю, что точно не соответствует моему коду, но я нашел обходное решение: установка Display.destroy(); после исключения, вместо того, чтобы бросать его. Таким образом, основная функция будет выглядеть следующим образом:

public static void main(String[] argv) { 
    QuadExample quadExample = new QuadExample(); 
    try { 
     quadExample.start(); 
    } catch (Exception e) { 
     Display.destroy(); // destroying the display here now 
     e.printStackTrace(); 
    } 
} 

Я не знаю, внутренности класса Display или как работает LWJGL, но я думаю, что Display.destroy делает что-то в асинхронном режиме, не закончена, когда исключение брошен, что приводит к неудачному доступу к памяти позже.

0

Пока я не могу ответить на вопрос, что именно идут не так, я могу предложить обходной путь:

boolean continue = true; 
while (continue) { 
    //GL code 
    Display.update(); 
    if(Display.isCloseRequested()) { 
     continue = false; 
    } 
} 
Display.destroy(); 
throw new Exception("Normal termination"); 

Это следует надеяться предотвратить оптимизацию цикла называть GL-команды для разрушенного дисплея.

+0

Я предполагаю, что вы хотели поставить переменную «продолжить» как условие цикла while. Это то, что сделано в оригинальном примере. Я стараюсь оставить цикл за исключением. – sunmat

Смежные вопросы