我写了一个3d模型库。
许多不同的模型可以共享相同的OpenGL资源,如纹理,缓冲区,程序,顶点属性对象等。
当不再需要模型时,我将其删除。因此,如果OpenGL资源未被引用,则必须使用OpenGL API命令删除它。
那么,以下哪项更好实施?
finalize()
内的OpenGL资源。我在很多文章中读到finalize()
是一个魔鬼。我相信它,因为GC可以随时调用(在OpenGL上下文破坏之后),或者根本不调用。那么,在这种情况下最好的方法是什么?
答案 0 :(得分:1)
我猜,finalize
总是错的。当你有足够的堆内存时,GC不会被调用...同时你可能会用完OpenGL资源。这是行不通的。
可以随时调用GC(在OpenGL上下文销毁之后)
这不是问题(假设可以随时释放未引用的资源;可能存在与线程和订单相关的问题),问题是它可能为您调用太迟。
因为GC已经用于引用计数。
没有。它使用了一种更有效的方法(与引用计数不同)可以处理周期。当你处理其他资源时,成本是咬你的非决定论。