2014-02-13 33 views
2

我正在写一点OpenGL图形“引擎”。据我了解,迄今为止,应该避免在Java中使用finalize,因为它会减慢GC。在OpenGL环境下使用finalize()的Java

我对自己做了OpenGL ressources的释放,通过注册的所有ressources(TextureShader(都实现Destroyable))我在一个名为OpenGL类中使用。此类具有公共静态方法render,initdestroy。 所以,如果有人使用这个引擎,他必须调用的方法destroy

如果任何哑语程序员忘记调用OpenGL.destroy(),是否会使用finalize()方法销毁对象?

这将是我的finalize()方法:

@Override 
protected void finalize() { 
    if(!isDestroyed()) 
     try { 
      destroy(); 
     } catch (DestroyFailedException e) {} 
} 
+1

没有错,除了终结器可能永远不会运行 –

+0

我知道,这就是为什么用户/程序员应该调用'OpenGL.destroy()'。虽然谢谢! – lschmierer

回答

1

在这种情况下它似乎是使用finalize()方法抛出异常给用户提请注意不破坏的错一个很好的解决方案目的。

1

销毁finalize()中的对象不是一个好主意,即使它是有条件的。

除了finalize()的一般问题之外,问题是只能调用来从具有当前OpenGL上下文的线程中销毁OpenGL对象,该线程必须是您的呈现线程或具有OpenGL上下文在同一个共享组中。据我所知,GC通常会在它自己的线程中运行,所以你不能指望在finalize()方法中有一个当前的OpenGL上下文。

finalize()方法添加诊断方法,以检测程序员何时错过调用方法,如@FlushFish的答案中所建议的,这听起来是一个好主意。但这与你应该做的一样多。