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

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

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

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

谢谢!

有帮助吗?

解决方案

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top