游戏场景不是垃圾收集

时间:2014-11-14 02:02:56

标签: java android eclipse

在我的安卓游戏中,我将整个游戏场景/关卡包裹在GameScene对象中。我希望一旦参考被新的GameScene取代,GameScene对象就会被垃圾收集。不幸的是,我有很多内存泄漏,每次更改级别,内存堆都会增长。这种情况发生在游戏因内存完全错误而崩溃之前。我已经使用了eclipse Mat,它警告我GameScene可能存在泄漏。我修好了它,所以它不再出现在Mat上了。在eclipse中擅长调试的人是否知道如何确定哪些对象没有被垃圾收集?我甚至不确定GameScene是否被垃圾收集。下面的代码给出了一个简短的例子,说明我如何调用Engine来创建和覆盖正在运行的GameScene中的当前GameScene以创建下一个级别。

class GameScene{
//lots of methods and objects...
@Override
  public void onClick(float x, float y) {
  // TODO Auto-generated method stub
  Engine.destroyScene();
  Engine.setScene(new GameScene(context, "chapters/classic/2/"));
 }
}
class SceneManager{
 public Scene currentScene;

 public void destroyScene() {
        sceneLoaded = false;
        currentScene.destroyScene();
        currentScene = null;
    }

    public void setScene(Scene scene) {
        currentScene = scene;
    }

    public void loadScene() {
        currentScene.loadScene();
        sceneLoaded = true;
    }
}

class Engine{
  public static void destroyScene(){
    sceneManager.destroyScene();
    resourceManager.deleteAllTextures();
  }

    public static void setScene(Scene scene) {
        sceneManager.setScene(scene);
    }

}

1 个答案:

答案 0 :(得分:0)

您可以使用VisualVm(包含在JDK中)之类的探查器来查看内存状态,每个对象的实例数以及其他有用信息。

在你的情况下,我会在开始时拍摄内存的快照,然后浏览游戏场景并拍摄另一张快照以与第一张快照进行比较。 VisualVM提供的另一个选项是在发生OutOfMemoryException时生成堆转储,然后您可以查找问题的来源。