LWJGL - OpenGL 上下文在关闭挂钩中丢失
LWJGL - OpenGL context gets lost in 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.run(Main.java:11)
有谁知道为什么上下文会自动销毁?
如果您需要任何额外信息,请直言。
OpenGL 上下文总是与一个线程相关联(或没有线程)。只能从上下文绑定到的线程的特定上下文调用函数。
由于关闭挂钩会启动一个新线程,因此您必须在发出任何命令之前将 OpenGL 上下文绑定到该线程。
我目前正在使用 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.run(Main.java:11)
有谁知道为什么上下文会自动销毁?
如果您需要任何额外信息,请直言。
OpenGL 上下文总是与一个线程相关联(或没有线程)。只能从上下文绑定到的线程的特定上下文调用函数。
由于关闭挂钩会启动一个新线程,因此您必须在发出任何命令之前将 OpenGL 上下文绑定到该线程。