Я начинаю играть с 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?
Не уверен, но, скорее всего, некоторая оптимизация компилятором пошла не так. Я не смог найти достоверную информацию о том, как java оптимизируется для скорости (прогнозирование ветвей или ранняя выборка данных). Но это показывает, что использование исключений там, где это действительно не нужно является субоптимальным дизайном. – Dawnkeeper
Я согласен с тем, что дизайн не самый лучший, но это то, что мне нужно, если я хочу интегрировать LWJGL в качестве графического бэкэнда для игрового движка, который у меня уже есть без глубоких изменений в коде игрового движка. – sunmat