2017-04-15 7 views
1

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.

+0

Was ist der Zweck des Shutdown-Hooks? Ist 'glfwWindowShouldClose' nicht gut genug? –

+1

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

+0

@NicolBolas nein, ich möchte diese Schnittstelle von anderen Klassen entkoppeln, also möchte ich nicht eine disposeAll-Methode oder etwas aufrufen. – RagingRabbit

Antwort

1

Ein OpenGL-Kontext ist immer mit einem Thread (oder ohne Thread) verknüpft. Funktionen können nur für einen bestimmten Kontext aus dem Thread aufgerufen werden, an den der Kontext gebunden ist.

Da der Shutdown-Hook einen neuen Thread startet, müssen Sie den OpenGL-Kontext an diesen Thread binden, bevor Sie Befehle absetzen.

Verwandte Themen