プロファイラーなどを使わずに手軽にメモリ使用量を画面内に表示したい!
ということでやり方を調べて見ました。
UnityAPIを用いての簡単表示方法
1 |
System.GC.GetTotalMemory(false) + Profiler.usedHeapSize |
これだけです!(単位はByteです)
だが!しかし!!簡単な方法にはやはりデメリットが有りました・・・・
- Profiler.userHeapSizeはProfilerがOffの場合は値が0になる
- iOS/AndroidのSDK等が確保するネイティブのものが計上されない
ということで、こちらはあくまでも目安値でデバッグ用途のようです。
では、正式な値を取得するにはどうすればいいのか調べたところ、
それぞれのプラットフォームごとにネイティブソースを書かなければいけないようです。
iOSでの表示方法
以下のネイティブソースでOK(単位はByteです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#import <Foundation/Foundation.h> #import <mach/mach.h> extern "C" { unsigned int getUsedMemorySize() { struct task_basic_info basic_info; mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; kern_return_t status; status = task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&basic_info, &t_info_count); if (status != KERN_SUCCESS) { NSLog(@"%s(): Error in task_info(): %s", __FUNCTION__, strerror(errno)); return -1; } return (unsigned int)basic_info.resident_size; } } |
こちらのmmファイルをPluginsフォルダ配下に置いて、Unity側から呼びましょう。
uGUIのTextに表示する場合以下のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Runtime.InteropServices; [UIContainerSettingAttribute("UIFooterExample",UILayer.Interaction)] public class UIViewUsedMemory : MonoBehaviour { [SerializeField] Text memoryText; #if UNITY_IOS [DllImport("__Internal")] private static extern int getUsedMemorySize(); #endif void Update () { float m = 0; #if UNITY_EDITOR m = ( System.GC.GetTotalMemory(false) + Profiler.usedHeapSize ) / 1024f; #elif UNITY_IOS m = getUsedMemorySize(); #endif memoryText.text = (m/1024f) + "KB " + (m/1024f/1024f) + "MB"; } } |
毎フレーム取得する必要があるのかは微妙ですが、とりあえず表示テストということで。
念のためプロファイラーで確かめてみる
では、こちらで取得できる値が正しいか確かめたいと思います。
iOSでのProfilerツールといえばやはり無敵のXcodeのInstruments!
こちらで確かめてみたいと思います(※XcodeのVer.7.3)
XcodeのInstrumentsを起動
ActivityMonitorを選択し起動
左上の認識端末をMacにつないでいる端末を選択
Installed Appsからアプリを選択
録画ボタンを選択し、アプリを起動する
下の一覧からProcessNameがアプリ名のものを探し、
その列のRealMemが使用しているメモリ値
こちらで確認した値とほぼ一緒でしたので
上記ソースは問題ないかと思います。
次回はAndroidについて解説したいと思います。
GitHub
ネイティブプラグイン含めてGitHubにアップいたしました。
https://github.com/VENIEGAMES/MemoryChecker-Unity
コメント