LibGDX setScreen()在多次完成时会崩溃游戏

时间:2014-03-11 18:41:14

标签: java libgdx

我有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次重置时崩溃。

2 个答案:

答案 0 :(得分:1)

内存上下模式是垃圾收集的标准模式,您只需担心垃圾收集后它是否开始无法达到前一个低点,因为这表明存在内存泄漏。听起来好像有些东西你没有处理,但如果你只是要重新装载所有相同的资产,为什么要处置任何东西呢?

切换到使用AssetManager。如果您在AssetManager.load构造函数中调用ScreenAssetManager.finishLoading方法调用Screen.showAssetManager.unload方法调用Screen.hide,则永远不要卸载任何您的GameScreen资产由于AssetManager引用计数的方式而导致您只会在导航到其他屏幕时卸载这些资产。不要忘记在`AssetManager.update方法中致电render

答案 1 :(得分:0)

你可能已经以某种方式解决了你的问题,因为它已经差不多一年了,但无论如何我都会把它放在这里,希望它可以帮助那些正在寻找解决这类错误的人。

我的一个应用程序有类似的机制,我也遇到了Box2d世界本机崩溃。在我处理原始版本后,我使用了setScreen(新的GameScreen(游戏))。

我曾经进行过以下类型的初始化:

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){...}

原来我必须在构造函数中初始化world。现在,无论有多少次我处理和重新创建它,我都有以下工作而没有任何崩溃:

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

我不确定这是否也是你案件的原因,但是,这只是另一个建议。