2012-09-20 10 views
16

libGDXで開発された私のAndroidアプリでは、ユーザーがゲームを終了しようとするとGdx.app.exit()を使用します。これでゲームは終了しますが、ユーザーがアプリを再起動すると、Texturesがすべてスクランブルされます(アプリを使用する時点を超えて)。 私はタスクマネージャからアプリケーションを強制終了すると、正常に再起動することに気付きました。AndroidアプリケーションのLibgdx app.exit()がアプリケーションを閉じていない

どうしてですか?

答えて

23

Javaオブジェクトの存続期間(アプリケーションプロセスの寿命と結びついています)とテクスチャオブジェクトの存続期間(アクティビティの可視性に関連付けられているOpenGLコンテキストの寿命と結びついています)との不一致を再発見しました。 。

アプリ "exit"では、アクティビティだけが終了し、Androidはバックグラウンドでプロセスをキャッシュしています。アプリを「再起動」すると、Androidは同じプロセスで新しいアクティビティを開始します。この場合、アクティビティは有効なJava Textureオブジェクトを検出していますが、OpenGLコンテキストで "指し示す"基礎となるバイトは消えています(アクティビティが表示されなくなったときにOpenGLコンテキストが無効になるため)。

修正点は、アクティビティの作成時にテクスチャを再読み込みすることです。テクスチャ(およびテクスチャなどを含むオブジェクトを含むオブジェクト)を含むすべてのオブジェクトがアクティビティライフサイクルに結びついていることを確認する必要があります。一般に、これは静的変数(アプリケーションライフサイクルの一部です)を避けることを意味しますが、必要に応じてフープをジャンプしてグローバルを無効化し、再初期化することができます。