libGDXで開発された私のAndroidアプリではGdx.app.exit()
、ユーザーがゲームを終了しようとしたときに使用します。これでゲームは終了しますが、ユーザーがアプリを再起動すると、すべてTextures
がスクランブルされます(アプリを使用するポイントを超えて)。タスクマネージャーからアプリを強制的に閉じると、正しく再起動することに気づきました。
なぜそれが起こるのですか?
Javaオブジェクトの存続期間(アプリケーションプロセスの存続期間に関連付けられている)とテクスチャオブジェクトの有効期間(アクティビティの可視性に関連付けられているOpenGLコンテキストの存続期間に関連付けられている)の間の不一致を再発見しました。
アプリの「終了」では、アクティビティのみが終了し、Androidはプロセスをバックグラウンドでキャッシュします。アプリを「再起動」すると、Androidは同じプロセスで新しいアクティビティを開始します。この場合、アクティビティは有効なJavaテクスチャオブジェクトを検出していますが、OpenGLコンテキストで「指している」基になるバイトはなくなっています(アクティビティが表示されなくなったときにOpenGLコンテキストが無効になるため)。
修正は、アクティビティの作成時にテクスチャを再ロードすることです。テクスチャを含むすべてのオブジェクト(およびテクスチャを含むオブジェクトを含むオブジェクトなど)がアクティビティライフサイクルに関連付けられていることを確認する必要があります。通常、これは静的変数(アプリケーションライフサイクルの一部)を回避することを意味しますが、必要に応じて、フープを飛び越えてグローバルを無効にし、再初期化することができます。