2017-09-26 8 views
0

私はAndroid Game Developmentを使い始めたばかりで、今はlibgdx Frameworkをテストしています。私はちょうどdispose()メソッドの重要性と、なぜそこにすべてのオブジェクトを処分する必要があるのだろうかと思っていたのですか?リソースを節約するだけですか?disposeメソッド(libgdx)の重要性

ありがとうございます。

答えて

3

Javaは「管理言語」です。これは、アプリケーションで使用するすべてのもの(クラスや配列のインスタンスなど)が、もはや使用しなくなったときに自動的に破棄されることを意味します。これは "ガベージコレクタ"によって行われます。たとえば、配列(float[] arr = new float[1000];)を使用するとメモリが割り当てられますが、配列(arr)を使用しなくなったときにガベージコレクタがそのメモリを解放するため、メモリを解放する必要はありません。

ただし、ガベージコレクタは自動的に何かを解放する方法を知りません。たとえば、ビデオメモリ(VRAM)にスペースを割り当てると、そのメモリに直接アクセスすることはできませんが、代わりにグラフィックスドライバを使用してそのメモリを使用します。たとえば、(擬似コード):

byte[] image = loadImageFromDisk(); 
int vramId = graphicsDriver.allocateMemory(image.length); 
graphicsDriver.copyToVRAM(vramId, image); 
image = null; 
... 
// At this point the garbage collector will release the memory used by "image". 
// However, the allocated VRAM still contains a copy of the image, so you can still use it. 
... 
graphicDriver.showImageOnScreen(vramId); 
... 
// The garbage collector can't free the VRAM though, you need to manually free that memory. 
... 
graphicsDriver.releaseMemory(vramId); 

この場合、実際には2種類のリソースがあります。

  1. ガベージコレクタによって自動的に解放されるリソース。それらを呼びましょう:管理リソース
  2. ガベージコレクタによって自動的に解放されないリソース。それらを呼びましょう:ネイティブリソース

おそらく想像する通り、libgdxは非常に多くのネイティブリソースをバックグラウンドで使用しています。これらのリソースを適切に管理するために、libgdxにはDisposableインターフェイスが含まれています。このDisposableインターフェイスを実装するすべてのクラスは、(直接的または間接的に)ガベージコレクタによって自動的に解放されないネイティブリソースを使用します。そのため、それらのクラスのメソッドが不要になった場合は、手作業でdisposeメソッドを呼び出す必要があります。

disposeメソッドを呼び出さないと、ネイティブリソースに問題が発生する可能性があります。例えば。使用可能なビデオメモリなどが使い果たされ、アプリケーションがクラッシュするなどの問題が発生する可能性があります。これは最も一般的に「メモリリーク」と呼ばれます。

+0

ありがとうございます! –

関連する問題