我开始玩LWJGL。我采取了this sample code,这很好。然后,我想改变循环停止的方式。这是我的新代码"而"循环:
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 :(得分:0)
虽然我无法回答问题究竟是什么问题,但我可以提出一个解决方法:
boolean continue = true;
while (continue ) {
//GL code
Display.update();
if(Display.isCloseRequested()) {
continue = false;
}
}
Display.destroy();
throw new Exception("Normal termination");
这应该有希望阻止循环的优化,以便为销毁的显示调用GL命令。
答案 1 :(得分: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异步执行某些事情,当抛出异常时它没有完成,导致以后的内存访问不良。