共享 OpenGL 资源:使用 finalize() 删除或实现引用计数



我写了一个3D模型库。

许多不同的模型,可以共享相同的OpenGL资源,如纹理,缓冲区,程序,顶点属性对象等。

当不再需要模型时,我会删除它。因此,如果 OpenGL 资源未被引用,也必须使用 OpenGL API 命令将其删除。

那么,以下哪些更好实现?

    设置 OpenGL
  • API 命令,用于删除对象finalize()内的 OpenGL 资源。我在很多文章中读到finalize()是魔鬼。我相信这一点,因为GC可以随时调用(在OpenGL上下文销毁之后(,或者根本不调用。
  • 为处理 OpenGL 资源的 Java 类实现引用计数系统。这需要大量的代码,就像重新发明轮子一样,因为 GC 已经可以使用引用计数。

那么,在这种情况下,最好的方法是什么?

我想,finalize总是错误的。当您有足够的堆内存时,不会调用 GC...与此同时,您可能会用完OpenGL资源。这是行不通的。

GC 可以随时调用(在 OpenGL 上下文销毁之后(

这不是问题所在(假设可以随时释放未引用的资源;可能存在与线程和顺序相关的问题(,问题是它可能被调用对您来说太晚了。

因为 GC 已经可以使用引用计数。

它没有。它使用一种更有效的方法(与引用计数不同(可以处理周期。代价是当你处理其他资源时,非确定性会咬你。

最新更新