为了账号安全,请及时绑定邮箱和手机立即绑定

内存泄漏。不断上升直至游戏崩溃

内存泄漏。不断上升直至游戏崩溃

斯蒂芬大帝 2023-09-27 10:18:33
我是 Android 开发新手,我在游戏使用的内存方面遇到了问题。它不断上升,直到崩溃。如果您能帮助我,我将不胜感激。谢谢。另外,关于Spritebatch,我是否需要在扩展为游戏的java类中调用this.dispose才能将其释放?如果可以的话我可以在哪里调用它?谢谢public class Pmacgame extends Game {    SpriteBatch batch;    BitmapFont font;    @Override    public void create () {        batch = new SpriteBatch();        font = new BitmapFont(Gdx.files.internal("r.fnt"));        this.setScreen(new Zero(this));    }    @Override    public void render () {        super.render();    }    @Override    public void dispose() {        font.dispose();        batch.dispose();    }}爪哇
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

我正在阅读字里行间,但看起来您必须在 Bullet/Target/Explosion 的构造函数中加载纹理,因为我没有看到您将纹理或纹理区域引用传递给它们的构造函数或方法render。


您应该在单个类中加载所有纹理,并传递对游戏对象的引用,以便它们“借用”和绘制。否则,您将无缘无故地加载相同图像的许多副本。


此外,纹理是一次性的,这意味着它使用本机内存,并且必须dispose()在让垃圾收集器获取它之前调用它。否则,本机内存就会泄漏。


在你的例子中,所有这些子弹、目标和爆炸都会一遍又一遍地加载许多纹理,并且当你删除它们时永远不会处理它们。


关于您关于 SpriteBatch 的问题。是的,您应该在实例化它的同一个类中处理它,并且dispose()这是执行此操作的正确位置。


编辑,准系统示例:


public class Assets implements Disposable {


    public final Texture horse;

    public final Texture bullet;

    // etc.


    public Assets (){

        horse = new Texture("horse.png");

        //...

    }


    public void dispose(){

        horse.dispose();

        //...

    }

}


public class Zero implements Screen, InputProcessor {

    private final Assets assets;

    //...


    public Zero (){

        assets = new Assets();

        //...

    }


    //...


    public void dispose(){

        assets.dispose();

        //...

    }

}


public class Bullet {

    //...


    public void render(SpriteBatch batch, Assets assets){

         batch.render(assets.bullet, /*...*/);

    }

}


查看完整回答
反对 回复 2023-09-27
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信