libgdx游戏不处理

即使调用dispose()方法后,我的游戏也不会完全退出。 当我第二次启动它时会加载黑屏,如果我手动杀死游戏并重新启动它,效果会很好。

我得到一个错误,说buffer not allocated with newUnsafeByteBuffer or already disposed当我尝试处置掉SpriteBatch对象。 这是我怀疑的问题。 但不能完全解决它。 请帮忙!

这里是我如何建立它(我已经把示例代码在这里只是为了告诉你们,在处理函数中没有可见的循环备份,请纠正我,如果我错了) – 在游戏画面中,

 public void dispose() { AssetLoader.dispose(); render.dispose(); Gdx.app.exit(); } 

在类AssetLoader-

 public void dispose(){ Texture.dispose(); sound.dispose(); } 

在游戏渲染类下 –

 public void dispose(){ spritebatch.dispose(); //throws an error when I GameScreen.dispose is called font.dispose(); shaperender.dispose(); } 

我相信我的精灵不会导致黑屏,但我找不到一种方法来处理它成功。 任何帮助将不胜感激。

dispose()方法的主体不是调用Gdx.app.exit()方法的正确位置。 调用后者将调用前​​者的调用,所以最终第二次在对象上调用dispose() 。 提示:阅读Gdx.app.exit()方法的javadoc,看看它究竟做了什么。

你应该做的是:

  1. dispose()方法中移除Gdx.app.exit()调用。
  2. 你有一个hide()方法,当你的应用程序在按下主页button,进入呼叫等时被隐藏起来时会调用这个方法。在这里调用dispose方法。
  3. 把调用放在Gdx.app.exit() ,例如在负责退出游戏的button的侦听器主体中,或者在Android中捕获后退button的命中,并在那里使用它。

这样你就可以确保你所有的资源都被正确地处理了,而且你不会再次尝试处理某些东西。

希望这可以帮助。

是的,你可以用隐藏方法编写你的所有处理代码。 但是,如果问题仍然存在,那么您可以在加载资产之前完成所有的处理工作,并在开始时将SpriteBatch设为null,然后创建它的对象。

喜欢 :

AssetLoader.dispose(); AssetLoader.load(“纹理path”,“Type.class”);

spriteBatch = NULL; spriteBatch =新的SpriteBatch();

这是一个老话题,但是我遇到了同样的问题,最后通过在每个屏幕的dispose方法中使用Gdx.app.log("note: ", "dispose called") LogCat打印出来。 实际情况是(在Android上):

  1. 按下HOMEbutton=>方法pause()被调用。
  2. 重新启动应用程序,并在重新启动最后一个屏幕的处理方法被调用来刷新屏幕。 通常这里不应该有任何问题。

问题出现了(至less在我的情况下)当我按下RETURNbutton并重新启动应用程序,导致崩溃。 现在,这发生了:

  1. 按下RETURNbutton=>这将调用主dispose()方法,而不是pause()方法。 所以,每个资源都被处理掉了。
  2. 之后,在重新启动应用程序时,它会尝试再次放弃最后一个屏幕以进行刷新,但通过按下RETURNbutton已经处理了该屏幕。 所以这里是问题:当按下RETURN时,当前屏幕的dispose方法被调用两次,导致以下错误: java.lang.IllegalArgumentException: buffer not allocated with newUnsafeByteBuffer or already disposed

我解决了这个问题,通过使用布尔值来检查当前屏幕是否已经处理。 下面是一个例子(我使用一个抽象的Screen类和一个ScreenManager ,通过调用一个子类的create方法来设置一个新的屏幕):

 public class MainScreen extends Screen { private boolean disposed; @Override public void create() { disposed = false; //rest of your code here } @Override public void dispose() { if (disposed == false) { //dispose your resources here disposed = true; } } } 

所以在按下RETURN之后, disposed将会被设置为true 。 重新启动时,它仍然是真实的,所以资源不会被处理两次。 接下来屏幕被重置,自动调用create so disposed = false

我希望这可以帮助任何人在未来的类似问题:)

调用Gdx.app.exit函数Gdx.app.exit从游戏的主ApplicationListener调用dispose函数。 调用dispose内部的函数会导致函数的recursion,因为它会到达它调用的dispose函数内部的Gdx.app.exit函数,导致错误,因为它试图处理已经处理的东西。