注目キーワード

Unity・IOS端末から使用メモリ・搭載メモリ(RAM)・MemoryWarningを確認・検出できる方法を解説するよ

背景

ゲーム開発するうえで使用メモリーは、最も神経を使う部分ではないでしょうか?

気づかずにメモリーを使いすぎて、気づいたら強制終了してしまうことがあるからです。

 

あとどのくらいメモリーがつかえるのか?

常に意識していないとすぐに忘れてしまうものです。意識しなくても良いように、画面上に常に使用メモリーを表示しておけば良いと考えます。

 

しかし、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)端末から取得した数字を使ったほうが、より正確に計測できるでしょう。