背景
ゲーム開発するうえで使用メモリーは、最も神経を使う部分ではないでしょうか?
気づかずにメモリーを使いすぎて、気づいたら強制終了してしまうことがあるからです。
あとどのくらいメモリーがつかえるのか?
常に意識していないとすぐに忘れてしまうものです。意識しなくても良いように、画面上に常に使用メモリーを表示しておけば良いと考えます。
しかし、Unityにもメモリーを取得するメソッドが存在するが、プロファイラーを有効にしていないと0が返ってくるなど不便があります。メモリー容量を確認するためだけにプロファイラーを有効にして再ビルド作業も意外に面倒です。
Unityから取得するメモリーの値は、目安であるため、実際に端末で使われているメモリーに差異があります。
より正確なメモリー容量を計測するのであれば、IOS端末から直接使用メモリーを取得できた方が良いと言えます。
この記事では、IOS端末から使用メモリなどの情報を取得する方法について、実際に作成したツールを元に解説します。
作成したツール
作成したツールはざっと以下のようなものです。
作ったもの(GitHubのリンクあり):
・IOS端末で、現在アプリが使用しているメモリ容量を取得する
・現在、IOS端末に搭載されているRAM容量を取得できる
・MemoryWarningを検出する
実際のソースを参考にしたい場合は、GitHubよりソースコードを参考にしてください。
なお、UnityからObjective-Cへのアクセス方法、およびUnityへの値の返し方については、他のサイトで詳しく解説しているためここでは取り上げません。
Unity・IOS、Android端末の使用メモリを取得するツール(GitHub)
https://github.com/jshirius/Unity_tools/tree/master/memory_info_tool/ios
作成したツールの解説
GitHubに公開してある「MemoryInfo.m」を元に実装のポイントについて解説します。
端末の使用メモリーを取得する
使用メモリを取得する
使用メモリを取得するだけならば以下の様にtask_info関数を呼び出だけだけで取得可能です。
task_infoの詳細仕様については、Task Informationの本家サイトをご確認してください。
https://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html
//タスク情報から使っているメモリ容量を取得する
struct task_basic_info basicInfo;
mach_msg_type_number_t basicInfoCount = TASK_BASIC_INFO_COUNT;
kern_return_t kern =task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&basicInfo, &basicInfoCount);
if (kern != KERN_SUCCESS) {
NSLog(@"getMemoryInfo error");
return @"";
}
//端末で現在使用しているメモリ(MB)
unsigned int resident_size =(unsigned int ) basicInfo.resident_size / 1024 /1024;
MemoryWarningを検出する
以下のコードを追加してMemoryWarningを受け取れるようにします。
MemoryWarningを受け取ったらUnitySendMessage関数を使ってUnity側にMemoryWarningを教えてあげることも可能です。
-(void)_setupObservers {
//MemoryWarningを検出するための準備
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
//MemoryWarningを検出したときのコールバック関数
- (void) handleMemoryWarning:(NSNotification *)notification
{
NSLog(@"handleMemoryWarning");
memoryWarningFlag = true;
//ここに以下のようにしてUnity側にメッセージを送ってもよい
//UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
}
尚、GitHubに公開しているMemoryInfo.mでは
「端末に積まれているRAM」「MemoryWarningが発生しているかどうかのフラグ」の情報も一緒に返すようにしているためJson形式でUnity側に返しています。
使用上の注意点
ツールを使うさい、いくつかの注意事項があります。
■本番での使用は推奨しません
メモリー情報を呼び出す処理は意外に重いです。
よって、本番(リリースするアプリ)では、メモリー情報を監視する処理を呼び出さないようにしたほうがよいです。
■1フレームごとに呼び出さないこと
メモリ情報を呼び出す処理は思いため、1フレーム中に終わらない可能性があります。
よって、数秒に1回の割合、ボタンを押したらメモリー容量がわかるような実装をしたほうが良いかもしれません。
■プログラムの責任について
このプログラムを使った結果、何かしらの不具合が発生しても当方は責任を負いません。
参考記事
今回の記事を書く際に参考にさせていただいたサイトです。
大変に参考になりました、ありがとうございます!
Task Informationの本家
https://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html
メモリ使用量を確認
https://lumber-mill.co.jp/notes/tips/130708_ios.html
メモリ使用量・空きメモリ量・ユーザCPU時間・システムCPU時間をログで表示する【Objective-C】
http://bekkou68.hatenablog.com/entry/2013/06/07/173820
まとめ
いかがですか?
使用メモリーは、常に意識しておく必要があります。
画面上に常に使用メモリーを表示しておくのも意識するための有効手段だと思います。
使用メモリーは実際の(ios)端末から取得した数字を使ったほうが、より正確に計測できるでしょう。