概要
libGDX アプリケーションのライフサイクルの説明です。 言語は Kotlin、Android/iOS アプリで動作確認をしています。
確認環境
- OS X El Capitan (10.11.6)
- Xcode 8.0
- Android Studio 2.2.2
- Multi-OS Engine Plugin 1.2.1
- Kotlin 1.0.4
- buildToolVersion 25.0.0
- compileSdkVersion 24
- libGDX 1.9.5-SNAPSHOT
参考情報
- The life cycle · libgdx/libgdx Wiki · GitHub
- 公式文書。ライフサイクルの章。
- Continuous & non continuous rendering · libgdx/libgdx Wiki · GitHub
- 公式文書。continuous & not continuous レンダリングの章。
解説
libGDX のアプリケーションを作成するには ApplicationListener インターフェイスを実装したクラスを作成する。 ApplicationAdapter クラスは ApplicationListener インターフェイスを実装し、各メソッドのデフォルト実装を提供する。
class MyGdxGame : ApplicationAdapter() { companion object { private val TAG = MyGdxGame::class.java.name } override fun create() { Gdx.app.logLevel = Application.LOG_DEBUG Gdx.app.debug(TAG, "create") //Gdx.graphics.isContinuousRendering = false } override fun pause() { Gdx.app.debug(TAG, "pause") } override fun resume() { Gdx.app.debug(TAG, "resume") } override fun resize(width: Int, height: Int) { Gdx.app.debug(TAG, "resize") } override fun render() { Gdx.app.debug(TAG, "render") } override fun dispose() { Gdx.app.debug(TAG, "dispose") } }
ライフサイクルの図は The life cycle · libgdx/libgdx Wiki · GitHub を参照。 各操作に応じて呼ばれるメソッドは以下のとおり。
操作 | Android | iOS |
---|---|---|
アプリ起動 | create, resize | create, resize |
ホーム | pause | pause |
タスクリスト | pause | pause |
pause状態でアプリ起動 | resume, resize | resume |
タスクリストでアプリ起動 | resume, resize | resume |
タスクリストでアプリ終了 | dispose | |
戻る(アプリ終了) | pause, dispose | 操作不可 |
回転 | resize | resize, resize |
(Android はタスクリストでアプリを終了しても dispose が呼ばれないのは仕様なのか?バグなのか? 呼ばれているがログに出ていないだけなのか?)
render メソッドは連続して呼ばれる。
使用しているハードウェアに応じて 1 秒間に 30-50-80 回の頻度で呼ばれる。
連続して呼び出される状態ではバッテリー消費が増える。
Gdx.graphics.isContinuousRendering = false
により連続呼び出しを無効にできる。
無効にした場合は、以下のタイミングでのみ render メソッドが呼ばれる。
- 入力イベントが発生した
Gdx.graphics.requestRendering
メソッドが呼ばれたGdx.app.postRunnable
メソッドが呼ばれた
UI Action (フェードイン、フェードアウトなど) では render メソッドが連続して呼ばれる。
デフォルトでは有効になっている。
stage.actionsRequestRendering = false
により無効にできる。
(Java の場合、isContinuousRendering, actionsRequestRendering は set メソッド呼び出しの形式で書く。)
変更履歴
2016-11-05
以下のようにしていましたが、kotlin-refrect を追加すると APK サイズが大きくなるとの意見を見かけたので kotlin-reflect を使わないようにしました。 kotlin-reflect を追加すると APK サイズが 0.7MB 増えます。
class MyGdxGame : ApplicationAdapter() { companion object { private val TAG = MyGdxGame::class.qualifiedName } ... }
上記のコードを実行するためには build.gradle に kotlin-reflect への依存を追加する必要がある。
MyGdxGame::class.qualifiedName
が kotlin-reflect を必要とする。
dependencies { ... compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" }