处置方法的重要性(libgdx)

时间:2017-09-26 19:08:41

标签: android libgdx dispose

我刚刚开始使用Android游戏开发,我现在正在测试libgdx Framework。我只是想知道dispose()方法的重要性是什么以及为什么必须处理那里的每个对象?只是为了节省资源?

欣赏它。

1 个答案:

答案 0 :(得分: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);

所以,实际上,在这种情况下有两种资源。

  1. 垃圾收集器将自动释放的资源。我们称之为:托管资源
  2. 垃圾收集器无法自动释放的资源。我们称之为:原生资源
  3. 正如您可能想象的那样,libgdx在幕后使用了大量的本机资源。为了正确管理这些资源,libgdx包含Disposable接口。实现此Disposable接口的每个类都使用(直接或间接)垃圾收集器无法自动释放的本机资源。因此,如果您不再需要这些类,则需要手动调用这些类的dispose方法。

    不调用dispose方法可能会导致本机资源出现问题。例如。您可能会耗尽可用的视频内存或类似内容,导致您的应用程序崩溃或类似。这通常被称为“内存泄漏”。