libgdx setscreen()在多次执行时使游戏崩溃

wztqucjr  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(313)

我有一个 GameScreen 在关卡结束后,我把屏幕调回 GameScreen 当用户点击重启按钮时作为重启。我这样做 this.setScreen(new GameScreen(game)); 在我做这行代码之前,我先处理屏幕本身,屏幕中使用的所有纹理,字体文件等等,除了box2d以外的所有东西(因为处理它会给我带来本地错误,使游戏崩溃)。但即使我在设置屏幕前处理资产,游戏在15-20次重启后仍然崩溃。
我通过打印javaheap分析了内存使用情况,发现momory的使用情况在每次重新启动时都会增加,直到某个点,然后回到低点,如下所示:

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

我读过关于内存使用的文章,发现这种行为很正常。但我的游戏还是在几次重启后崩溃了,甚至没有给出错误信息。
是什么原因造成的?
编辑:我在中兴blade上测试了这款游戏,发现每次重置都会让游戏变慢,但在大约15-20次重置后仍然会崩溃。

v9tzhpje

v9tzhpje1#

你可能已经解决了你的问题,因为它已经快一年了,但我会把这个放在这里无论如何,希望它可以帮助人们谁是寻找解决这种错误的方法。
我的一个应用程序也有类似的机制,我也经历了box2d world的本地崩溃。那是我在处理完原来的游戏后使用setscreen(newgamescreen(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

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

r9f1avp5

r9f1avp52#

内存上下模式是垃圾收集的标准模式,您只需担心在垃圾收集之后它是否开始无法达到之前的低点,因为这将表明内存泄漏。听起来可能有些东西你没有处理,但为什么你要处理任何东西,如果你只是要重新加载所有相同的资产?
切换到使用 AssetManager . 如果你打电话 AssetManager.load 在你的 Screen 建造师, AssetManager.finishLoading 在你的 Screen.show 方法和 AssetManager.unload 在你的 Screen.hide 方法你不应该卸下你的任何东西 GameScreen 资产因为什么 AssetManager 进行引用计数,只有在导航到其他屏幕时才卸载这些资产。别忘了打电话 ``AssetManager.update在你的render` 方法。

相关问题