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

时间:2017-05-27 18:25:16

标签: java garbage-collection reference-counting finalize

我写了一个3d模型库。

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

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

那么,以下哪项更好实施?

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

这不是问题(假设可以随时释放未引用的资源;可能存在与线程和订单相关的问题),问题是它可能为您调用太迟。

  

因为GC已经用于引用计数。

没有。它使用了一种更有效的方法(与引用计数不同)可以处理周期。当你处理其他资源时,成本是咬你的非决定论。