UnityでAndroidアプリ開発していたら強制終了するほどメモリーを使いすぎていた。
そんな経験はありませんか?
解決手段の一つとして、Andorid端末から取得した使用メモリーを常に画面で確認する方法があると思います。常に表示させておけば、使用メモリーの確認忘れを避けることができるでしょう。
この記事では、Android端末から使用メモリなどの情報を取得する方法について、実際に作成したツールを元に解説します。
Unityにも使用メモリ容量を取得する方法はあるが・・・
Unityにもメモリーを取得するメソッドが存在します。
しかし、プロファイラーを有効にしていないと0が返ってくるなど不便があります。メモリー容量を確認するためだけにプロファイラーを有効にして再ビルド作業も意外に面倒です。
Unityから取得するメモリーの値は、目安であるため、実際に端末で使われているメモリーに差異があります。
より正確なメモリー容量を計測するのであれば、Android端末から直接使用メモリーを取得できた方が良いと言えます。
作成したツール
作成したツールはざっと以下のようなものです。
作ったもの(GitHubのリンクあり):
・Android端末で、現在アプリが使用しているメモリ容量を取得する
・現在、Andorid端末に搭載されているRAM容量を取得できる
・MemoryLowを検出する
実際のソースを参考にしたい場合は、GitHubよりソースコードを参考にしてください。
なお、UnityからAndroidネイティブ(Java)へのアクセス方法、およびUnityへの値の返し方については、他のサイトで詳しく解説しているためここでは取り上げません。
Unity・Android端末の使用メモリを取得するツール(GitHub)
https://github.com/jshirius/Unity_tools/tree/master/memory_info_tool/android
作成したツールの解説
GitHubに公開してある「MemorySample.java」を元に実装のポイントについて解説します。
端末の使用メモリーを取得する
使用メモリを取得する
使用メモリを取得するには、以下の様にgetProcessMemoryInfo関数を呼び出だすことによって実現することが可能です。
尚getProcessMemoryInfoでメモリーの情報を取得するためには自身のプロセスのID情報が必要になるため、「android.os.Process.myPid() 」を使って自身プロセスIDを取得しています。
//自分自身のプロセスIDを取得する
final int[] pids = new int[]{ android.os.Process.myPid() };
//メモリー情報を取得する
//本家のコメント
//Return information about the memory usage of one or more processes.
final Debug.MemoryInfo[] memoryInfos = activityManager.getProcessMemoryInfo(pids);
float sumMemories = 0;
//本アプリが使用しているメモリ取得
for (Debug.MemoryInfo m : memoryInfos) {
//KB単位で取得する
sumMemories += m.getTotalPss();
Log.i("tag", " pidMemoryInfo.getTotalPss(): " + m.getTotalPss() + "\n");
}
//使用メモリー(MB)
sumMemories = sumMemories / 1024;
MemoryLowを検出する
以下のコードを追加してMemoryLowを受け取れるようにします。
final Context context = UnityPlayer.currentActivity.getApplication().getApplicationContext();
ActivityManager activityManager = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
//MemoryLow状態かどうかのフラグ
bool lowMemory = memoryInfo.lowMemory;
尚、GitHubに公開しているMemorySample.javaでは
「端末に積まれているRAM」「MemoryLowが発生しているかどうかのフラグ」の情報も一緒に返すようにしているためJson形式でUnity側に返しています。
PR「即Unityで稼げるようになりたいなら」マンツーマンで学べる【Samurai】
使用上の注意点
ツールを使う際、いくつかの注意事項があります。
■本番での使用は推奨しません
メモリー情報を呼び出す処理は意外に重いです。
よって、本番(リリースするアプリ)では、メモリー情報を監視する処理を呼び出さないようにしたほうがよいでしょう。
■1フレームごとに呼び出さないこと
メモリ情報を呼び出す処理は思いため、1フレーム中に終わらない可能性が高いです。
実際に1フレームごとにAndroid端末から使用メモリーを取得する処理を呼び出していたら、明らかにカクカクした動きをしていました。
よって、数秒に1回の割合、もしくはボタンを押したらメモリー容量がわかるような実装をしたほうが良いかもしれません。
■プログラムの責任について
このプログラムを使った結果、何かしらの不具合が発生しても当方は責任を負いません。
まとめ
いかがですか?
使用メモリーは、常に意識しておく必要があります。
画面上に常に使用メモリーを表示しておくのも意識するための有効手段だと思います。
使用メモリーは実際の(Android)端末から取得した数字を使ったほうが、より正確に計測できるでしょう。