我刚刚开始使用Android游戏开发,我现在正在测试libgdx Framework
。我只是想知道dispose()
方法的重要性是什么以及为什么必须处理那里的每个对象?只是为了节省资源?
欣赏它。
答案 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);
所以,实际上,在这种情况下有两种资源。
正如您可能想象的那样,libgdx在幕后使用了大量的本机资源。为了正确管理这些资源,libgdx包含Disposable
接口。实现此Disposable
接口的每个类都使用(直接或间接)垃圾收集器无法自动释放的本机资源。因此,如果您不再需要这些类,则需要手动调用这些类的dispose
方法。
不调用dispose
方法可能会导致本机资源出现问题。例如。您可能会耗尽可用的视频内存或类似内容,导致您的应用程序崩溃或类似。这通常被称为“内存泄漏”。