【问题标题】:Java LibGDX memory leakJava LibGDX 内存泄漏
【发布时间】:2016-09-29 16:08:43
【问题描述】:

我们正在为我们的学校作业制作一款 2D 自上而下的射击游戏。但是我们遇到了一个我们无法解决的问题。我们接收玩家并希望将他们全部呈现。当我们注释给定的代码时,滞后消失了,RAM 使用稳定。但是,当我们将零件留在其中时,ram 将以每秒 50 MB/s 的速度增加。

我们在此代码中找不到错误,如果您知道什么,请告诉我们。 如果您需要更多信息,请告诉我,我会尽快回复。

            List<SimplePlayer> localMultiplayers = new ArrayList(this.multiplayers);
            this.multiplayers.clear();
            for (SimplePlayer splayer : localMultiplayers) {
                try {
                    Player p = new Player(splayer, this);
                    batch.setProjectionMatrix(game.camera.combined);
                    batch.begin();
                    p.render(batch);   
                    this.fontwhite.draw(batch, splayer.getName(), splayer.getX(), splayer.getY() + 76);
                    this.fontred.draw(batch, Integer.toString(splayer.getHitPoints()), splayer.getX() + 12, splayer.getY() + 64);
                    batch.end();
                } catch (Exception ex) {
                Logger.getLogger(GameScreen.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

编辑:这段代码在我们的 GameScreen.render() 中找到,我们不知道这是否是问题所在。

【问题讨论】:

  • 如果你只有一个玩家怎么办?这可以告诉你问题是否存在。显示您的播放器类,可能还有负责新播放器的代码,您可以将它们添加到数组列表中。

标签: java memory-leaks libgdx 2d render


【解决方案1】:

Guido,别开玩笑了,它泄露了 :-)。每个渲染周期(每秒大约 60 次),您正在为每个客户端创建新的 Player 实例(我只能假设)其中有某种纹理。如果您不想再使用它,则必须调用 Texture.dispose() - 否则它会泄漏。

解决方法是单独创建玩家列表(在玩家加入/离开游戏时添加/删除玩家)并继续调用他们的渲染方法而不创建新实例。

【讨论】:

  • 是的,你完全正确。我们一遍又一遍地为每个玩家加载所有纹理。我们制作了一个静态纹理,现在它已修复 :)
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2015-02-26
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多