Ich arbeite derzeit mit Java und LWJGL 3 und ich schreibe einige Wrapper für Sachen wie Vertex-Array-Objekte, Vertex-Puffer-Objekte, etc. Jetzt ist es eine gute Gewohnheit zu löschen Diese Objekte vor dem Programm beenden, also habe ich einen Shutdown-Hook erstellt, der die Aufräumarbeiten erledigen soll.LWJGL - OpenGL Kontext geht verloren in Shutdown-Hook
Aber wenn ich eine OpenGL-Funktion innerhalb der Shutdown-Hook aufrufen, bekomme ich eine illegale Ausnahme, die besagt, dass ein OpenGL-Kontext nicht initialisiert wurde.
Ich habe ein Testprogramm geschrieben, die dieses Verhalten reproduziert:
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();
}
}
Stack Trace:
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)
Weiß jemand, warum der Kontext automatisch zerstört wird?
Wenn Sie zusätzliche Informationen benötigen, sagen Sie es einfach.
Was ist der Zweck des Shutdown-Hooks? Ist 'glfwWindowShouldClose' nicht gut genug? –
Beachten Sie, dass OpenGL-Kontexte an einen bestimmten Thread gebunden sind. Da Sie einen neuen Thread erstellen, müssen Sie den Kontext binden, bevor Sie ihn verwenden. – BDL
@NicolBolas nein, ich möchte diese Schnittstelle von anderen Klassen entkoppeln, also möchte ich nicht eine disposeAll-Methode oder etwas aufrufen. – RagingRabbit