Mein Spiel wird auch nach dem Aufruf der dispose () -Methode nicht vollständig beendet. Es lädt einen schwarzen Bildschirm, wenn ich es zum zweiten Mal starte, und funktioniert gut, wenn ich das Spiel manuell beende und neu starte.
Ich erhalte eine Fehlermeldung, buffer not allocated with newUnsafeByteBuffer or already disposed
wenn ich versuche, das SpriteBatch-Objekt zu entsorgen. Dies ist, wo ich das Problem vermute. Aber nicht in der Lage, es vollständig zu beheben. Bitte helfen Sie!
Hier ist, wie ich es erstellt habe (ich habe den Beispielcode hier eingefügt, um euch zu zeigen, dass es keine sichtbaren Loopbacks in der Entsorgungsfunktion gibt, bitte korrigiert mich, wenn ich falsch liege) - Im Spielbildschirm,
public void dispose() {
AssetLoader.dispose();
render.dispose();
Gdx.app.exit(); }
Unter der Klasse AssetLoader-
public void dispose(){
Texture.dispose();
sound.dispose();
}
Unter Spiel rendern Klasse -
public void dispose(){
spritebatch.dispose(); //throws an error when I GameScreen.dispose is called
font.dispose();
shaperender.dispose();
}
Ich glaube, dass mein Spritebatch nicht entsorgt, was den schwarzen Bildschirm verursacht, aber ich kann keinen Weg finden, ihn erfolgreich zu entsorgen. Jede Hilfe wäre sehr dankbar.
Antworten:
Der Hauptteil der
dispose()
Methode ist nicht der richtige Ort, um dieGdx.app.exit()
Methode aufzurufen . Wenn Sie den letzteren aufrufen, wird der Anruf des ersteren aufgerufen, sodass Siedispose()
Ihre Objekte zum zweiten Mal aufrufen . Tipp: Lesen Sie das Javadoc derGdx.app.exit()
Methode, um genau zu sehen, was sie tut.Was Sie tun sollten, ist:
Gdx.app.exit()
Aufruf von Ihrerdispose()
Methode.hide()
Methode, die aufgerufen wird, wenn Ihre App "versteckt" wird, wenn Sie die Home-Taste drücken, einen eingehenden Anruf erhalten usw. Rufen Sie hier die Dispose-Methode an.Gdx.app.exit()
Beispiel den Hörer einer Schaltfläche an, die für das Beenden des Spiels verantwortlich ist, oder fangen Sie den Druck auf die Zurück-Schaltfläche in Android ab und verwenden Sie ihn dort.Auf diese Weise stellen Sie sicher, dass alle Ihre Ressourcen ordnungsgemäß entsorgt werden und dass Sie nicht versuchen, etwas ein zweites Mal zu entsorgen.
Hoffe das hilft.
quelle
Ja, Sie können Ihren gesamten Code Ihrer Entsorgung in der Hide-Methode schreiben. Wenn das Problem dennoch auftritt, können Sie Ihre gesamte Entsorgungsarbeit unmittelbar vor dem Laden Ihrer Assets ausführen und den SpriteBatch beim Start auf Null setzen und dann sein Objekt erstellen.
Mögen :
AssetLoader.dispose (); AssetLoader.load ("Pfad der Textur", "Type.class");
und
spriteBatch = null; spriteBatch = new SpriteBatch ();
quelle
Dies ist ein altes Thema, aber ich hatte das gleiche Problem und fand es schließlich heraus, indem
Gdx.app.log("note: ", "dispose called")
ich LogCat-Drucke in der Entsorgungsmethode jedes Bildschirms verwendete. Was tatsächlich passiert ist (auf Android):pause()
wird aufgerufen.Das Problem tritt (zumindest in meinem Fall) auf, wenn ich die RETURN-Taste drückte und die App erneut startete, was zu einem Absturz führte. Nun passiert dies:
dispose()
Hauptmethode auf, NICHT diepause()
Methode. Daher wird jede Ressource entsorgt.java.lang.IllegalArgumentException: buffer not allocated with newUnsafeByteBuffer or already disposed
.Ich habe dieses Problem gelöst, indem ich mit einem Booleschen Wert überprüft habe, ob der aktuelle Bildschirm bereits angezeigt wurde. Unten ist ein Beispiel (ich verwende eine abstrakte
Screen
Klasse und eineScreenManager
, die einen neuen Bildschirm durch Aufrufen dercreate
Methode einer Unterklasse festlegt ):Also nach dem Drücken von RETURN
disposed
wird auf gesetzttrue
. Beim Neustart bleibt dies weiterhin der Fall, sodass die Ressourcen nicht zweimal entsorgt werden. Als nächstes wird der Bildschirm zurückgesetzt und ruftcreate
dies automatisch aufdisposed = false
Ich hoffe das hilft jemandem mit einem ähnlichen Problem in der Zukunft :)
quelle
if(!disposed)
?Durch Aufrufen der
Gdx.app.exit
Funktion wird diedispose
FunktionApplicationListener
ohnehin vom Hauptteil des Spiels aus aufgerufen. Das Aufrufen der Funktion innerhalb der Dispose führt zu einer Rekursion der Funktion, da sie dieGdx.app.exit
Funktion innerhalb der aufgerufenendispose
Funktion erreicht, was zu einem Fehler führt, wenn versucht wird, etwas zu entsorgen, das bereits entsorgt wurde.quelle