【问题标题】:LibGDX setScreen() crashes game when done multiple timesLibGDX setScreen() 多次完成时会导致游戏崩溃
【发布时间】:2015-02-11 18:36:34
【问题描述】:

我有一个GameScreen,在关卡结束后,当用户点击重新启动按钮时,我将屏幕设置回GameScreen,作为重新启动。我这样做this.setScreen(new GameScreen(game));,在我执行那行代码之前,我处理屏幕本身,屏幕中使用的所有纹理,字体文件等等,除了 box2D 之外的所有内容(世界因为处理它会给我本机错误并使游戏崩溃)。但是即使我在设置屏幕游戏之前处置资产,在 15-20 重新启动后仍然会崩溃。

我通过打印 JavaHeap 分析了内存使用情况,发现内存使用量在每次重启时都会增加,直到某个点然后又回到低点,如下所示:

- Restart1: 10MB
- Restart2: 13MB
- Restart3: 15MB
- Restart4: 10MB
- Restart5: 11MB
- Restart6: 14MB
- Restart7: 9MB

我已阅读有关内存使用情况的信息,发现这种行为是正常的。但是我的游戏在几次重启后仍然崩溃,甚至没有给出错误消息。

这可能是什么原因造成的?

编辑:我在 ZTE Blade 上测试了游戏,发现每次重置游戏都会变慢,但在大约 15-20 次重置后仍然崩溃。

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    内存上下模式是垃圾回收的标准模式,您只需要担心垃圾回收后它开始无法达到之前的低点,因为这表明内存泄漏。听起来您可能没有处理某些东西,但如果您只是要重新加载所有相同的资产,为什么还要处理任何东西?

    切换到使用AssetManager。如果你在Screen 构造函数中调用AssetManager.load,在Screen.show 方法中调用AssetManager.finishLoading,在Screen.hide 方法中调用AssetManager.unload,你永远不应该卸载你的任何GameScreen 资产,因为AssetManager 的作用引用计数,并且只有在导航到不同的屏幕时才会卸载这些资产。不要忘记在您的 render 方法中调用 `AssetManager.update

    【讨论】:

    • 我已经分析过了,没有泄漏。大约 15-20run 内存使用量与开始时相同。如果我整个游戏只有 4-6 个精灵和 1 个字体文件,我真的需要使用 AssetManager 吗?
    • 不,您不必这样做,但确实没有任何理由不这样做。为什么不首先弄清楚问题是否与您的资产有关...在您的 Game.create 方法中加载它们并将它们传递到您的 GameScreen (现在可能是一些静态变量),然后只在 @987654334 中处理@.
    • 但是我没有收到任何错误,游戏只是在没有任何通知的情况下崩溃。我应该如何调试以查看其资产是否相关?
    • 也许通过尝试做我告诉你的事情?您基本上说,当您重新创建屏幕并一遍又一遍地处理/重新加载您的资产时,它会崩溃,所以第一步可能是在您不需要时停止一遍又一遍地重新加载相同的资产。如果这不能解决它,那么你知道你有一个不同的问题。你真的没有调试/日志输出吗?您使用的是桌面、android 等哪个后端?你的日志级别是多少?
    • 好的,我会继续尝试实现它,这样我就不需要处理了。我正在使用 Eclipse 和 LogCat。我使用安卓和桌面
    【解决方案2】:

    你可能已经以某种方式解决了你的问题,因为它已经快一年了,但我还是把它放在这里,希望它可以帮助那些正在寻找解决这类错误的人。

    我的一个应用程序有一个类似的机制,我也遇到了 Box2d 世界的原生崩溃。那是我在处理原始屏幕后使用 setScreen(new GameScreen(game)) 的时候。

    我曾经有以下几种初始化:

    public class GameScreen implements Screen {
    /*Global Variables*/
    ... 
    final private static World world = new World(new Vector2(0, 0), true);  //Create a world with no gravity;
    ...
    public GameScreen(SGM game){...}
    

    原来我必须在构造函数中初始化世界。现在,无论我处理和重新创建多少次,我都可以正常工作:

    public class GameScreen implements Screen {
    /*Global Variables*/
    ... 
    final private static World world;
    ...
    public MatchScreen(SGM game){
    this.game = game;
    world = new World(new Vector2(0, 0), true);   //Create a world with no gravity
    

    我不确定这是否也是您的情况的原因,但这只是另一个建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多