Java JVM使用JOGL、顶点缓冲区对象崩溃,并试图用finalize方法释放vbo

Java JVM使用JOGL、顶点缓冲区对象崩溃,并试图用finalize方法释放vbo,java,opengl,garbage-collection,jogl,jvm-crash,Java,Opengl,Garbage Collection,Jogl,Jvm Crash,我有一些我写的CAD软件。正在绘制的每个组件都有一组顶点缓冲区对象。如果组件被删除,我必须在finalize方法中释放顶点缓冲区对象,例如: if (gl != null) { Integer[] keys = vbos.keySet().toArray(new Integer[0]); for (int i = 0; i < keys.length; i++) { Integer tmp = keys[i];

我有一些我写的CAD软件。正在绘制的每个组件都有一组顶点缓冲区对象。如果组件被删除,我必须在finalize方法中释放顶点缓冲区对象,例如:

    if (gl != null) {
        Integer[] keys = vbos.keySet().toArray(new Integer[0]);
        for (int i = 0; i < keys.length; i++) {
            Integer tmp = keys[i];
            if (tmp != null) {
                if (gl.glIsBufferARB(tmp.intValue()));
                gl.glDeleteBuffersARB(1, new int[]{tmp.intValue()}, 0);
            }
        }
    }
if(gl!=null){
整数[]keys=vbos.keySet().toArray(新整数[0]);
for(int i=0;i
然而,我有时会遇到SIGSEV和JVM崩溃。hs_err日志文件指向glis.glIsBufferArb(tmp.intValue())

我相信这意味着我的gl对象不再有效

我认为它应该仍然有效。该程序在崩溃之前一直在运行。有没有一种方法可以在不存储对GL对象的引用的情况下释放glbuffer


谢谢大家!

这里您将遇到的最明显的问题是,OpenGL上下文只能在其活动的线程中引用。一般来说,这将是您的渲染线程,这意味着OpenGL上下文在JVM的终结器线程中不可用。在我看来,这似乎是你犯错误的最可能原因。我建议您保留一个无效VBO的全局列表,并让finalize方法将ID添加到该列表中。然后,您可以定期从渲染线程处理该列表,从而进行实际删除VBO所需的OpenGL调用


您可以快速了解OpenGL在多线程环境中的行为。

这里您将遇到的最明显的问题是,OpenGL上下文只能在其活动的线程中引用。一般来说,这将是您的渲染线程,这意味着OpenGL上下文在JVM的终结器线程中不可用。在我看来,这似乎是你犯错误的最可能原因。我建议您保留一个无效VBO的全局列表,并让finalize方法将ID添加到该列表中。然后,您可以定期从渲染线程处理该列表,从而进行实际删除VBO所需的OpenGL调用

您可以在多线程环境中快速了解OpenGL的行为