【问题标题】:(LIBGDX) how to clean the RAM memory that my app uses?(LIBGDX) 如何清理我的应用程序使用的 RAM 内存?
【发布时间】:2019-09-13 22:35:33
【问题描述】:

我在 libgdx 中创建了一个游戏应用程序,通常它运行良好,但有时它运行缓慢,在我看来是 RAM 内存问题。我有一个扩展 Game.class 的主类,在主类中我创建了一个播放屏幕类,当玩家死亡时我再次创建播放屏幕类。我相信内存没有释放的RAM内存,经过多次死亡后它会积累,事实上如果我在任务管理器打开的情况下运行应用程序,当死亡增加内存也会增加。

这是代码:

public class MyGdxGame extends Game(){
    private PlayScreen play_screen;  
    private SpriteBatch batch;
    public void create(){
    batch=new SpriteBatch();

    play_screen=new PlayScreen(this);

    setScreen(play_screen);

}

public void render(){

    if(play_screen.death==true){

        play_screen=new PlayScreen(this);

        setScreen(play_screen);

    }

}

所以我做了一个测试:

public void render(){

    do{
        play_screen=null;
        play_screen=new PlayScreen(this);
        setScreen(play_screen);
    }while(1!=2);
}

我在任务管理器打开的情况下运行应用程序,内存迅速增加直到崩溃。那么如何清理 RAM 内存呢?

【问题讨论】:

  • 垃圾收集确实会释放和分配内存,而您无权访问它。您可以做的就是在高级编程中管理 RAM。
  • 您遗漏了太多代码,以至于无法确定问题所在。
  • 1) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码流更容易理解!大多数 IDE 都有专门用于格式化代码的键盘快捷键。 2)如需更好的帮助,请edit添加minimal reproducible exampleShort, Self Contained, Correct Example

标签: java android memory libgdx


【解决方案1】:

许多 LibGDX 对象必须手动清除内存,请参阅this。他们实现了接口Disposable,它的方法是#dispose()

我没有看到您处理任何使用过的资源,您的 SpriteBatch 就是这些对象之一。 完成后致电batch.dispose()。之后将其设置为 null 是可选的,但建议使用已处置的资源可能会导致意外行为。代码看起来像这样,当你不再需要它时应该调用它:

if(batch != null) {
    batch.dispose();
    batch = null;
}

LibGDX 内存泄漏几乎总是因为一个或多个资源没有被释放

【讨论】:

  • 是的,这就是问题所在,现在我已经解决了。实际上做了一个测试,在 MyGdxGame.render() 方法中,我输入了代码: play_screen=new PlayScreen(this);所以我不断创建新的 play_screen 对象,当我使用任务管理器运行时,我可以看到应用程序的临时内存增加了,而不是 play_screen.dispose();临时记忆保持稳定。所以我想我已经解决了。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2022-08-04
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多