代码之家  ›  专栏  ›  技术社区  ›  J.Lucas

处置方法的重要性(libgdx)

  •  0
  • J.Lucas  · 技术社区  · 7 年前

    libgdx Framework 目前。我只是想知道 dispose() 方法是什么?为什么有必要在那里处理每个对象?只是为了节省资源?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Xoppa    7 年前

    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. 本地资源

    正如您可能想象的那样,libgdx在后台使用了相当多的本地资源。为了正确管理libgdx包含的资源 Disposable 接口使用(直接或间接)垃圾收集器无法自动释放的本机资源。因此,您需要手动调用 dispose 如果您不再需要它们,请在这些类上使用。

    不呼叫 处置 方法可能会导致本机资源出现问题。E、 g.可能会耗尽可用的视频内存或类似内存,导致应用程序崩溃或类似情况。这通常被称为“内存泄漏”。