即使调用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,看看它究竟做了什么。
你应该做的是:
dispose()
方法中移除Gdx.app.exit()
调用。 hide()
方法,当你的应用程序在按下主页button,进入呼叫等时被隐藏起来时会调用这个方法。在这里调用dispose方法。 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上):
pause()
被调用。 问题出现了(至less在我的情况下)当我按下RETURNbutton并重新启动应用程序,导致崩溃。 现在,这发生了:
dispose()
方法,而不是pause()
方法。 所以,每个资源都被处理掉了。 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
函数,导致错误,因为它试图处理已经处理的东西。