1

我有一些我写的 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);
            }
        }
    }

但是我有时会遇到 SIGSEV 和 JVM 崩溃。hs_err 日志文件指向 gl.glIsBufferArb(tmp.intValue())。

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

我认为它应该仍然有效。该程序仍在运行,直到崩溃。有没有办法在不存储对 GL 对象的引用的情况下释放 glbuffer?

谢谢!

4

1 回答 1

4

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

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

于 2011-12-06T21:43:28.307 回答