2014-02-13 62 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的答案中所建議的,這聽起來是一個好主意。但這與你應該做的一樣多。