LWJGL - OpenGL上下文在关闭钩子中丢失

时间:2017-04-15 11:50:47

标签: java opengl lwjgl shutdown-hook

我目前正在使用Java和LWJGL 3,我正在为顶点数组对象,顶点缓冲对象等编写一些包装器。 现在,在程序退出之前删除这些对象是一个好习惯,所以我创建了一个关闭钩子,它应该进行清理。

但是当我在关闭钩子里面调用一个OpenGL函数时,我得到一个非法的状态异常,它说OpenGL上下文没有被初始化。

我已经编写了一个重现此行为的测试程序:

public static void main(String[] args) {
    GLFW.glfwInit();
    long window = GLFW.glfwCreateWindow(100, 100, "", 0, 0);

    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            GL15.glDeleteBuffers(0);
            GLFW.glfwTerminate();
        }
    });

    while (!GLFW.glfwWindowShouldClose(window)) {
        GLFW.glfwPollEvents();
    }
}

堆栈追踪:

Exception in thread "Thread-0" java.lang.IllegalStateException: No GLCapabilities instance set for the current thread. Possible solutions:
a) Call GL.createCapabilities() after making a context current in the current thread.
b) Call GL.setCapabilities() if a GLCapabilities instance already exists for the current context.
at org.lwjgl.opengl.GL.getCapabilities(GL.java:241)
at org.lwjgl.opengl.GL15.nglDeleteBuffers(GL15.java:152)
at org.lwjgl.opengl.GL15.glDeleteBuffers(GL15.java:178)
at core.Main$1.run(Main.java:11)

有谁知道为什么上下文会被自动销毁?

如果您需要任何额外信息,请说明。

1 个答案:

答案 0 :(得分:1)

OpenGL上下文始终与一个线程(或没有线程)相关联。只能从绑定上下文的线程在特定上下文中调用函数。

由于shutdown hook启动了一个新线程,你必须在发出任何命令之前将OpenGL上下文绑定到该线程。