【Unity】実機上(ゲーム内)でメモリ使用量を表示してみる 〜iOS編〜

Editor

プロファイラーなどを使わずに手軽にメモリ使用量を画面内に表示したい!

ということでやり方を調べて見ました。

UnityAPIを用いての簡単表示方法

System.GC.GetTotalMemory(false) + Profiler.usedHeapSize

これだけです!(単位はByteです)

だが!しかし!!簡単な方法にはやはりデメリットが有りました・・・・

  • Profiler.userHeapSizeはProfilerがOffの場合は値が0になる
  • iOS/AndroidのSDK等が確保するネイティブのものが計上されない

ということで、こちらはあくまでも目安値でデバッグ用途のようです。

 

では、正式な値を取得するにはどうすればいいのか調べたところ、

それぞれのプラットフォームごとにネイティブソースを書かなければいけないようです。

iOSでの表示方法

以下のネイティブソースでOK(単位はByteです)

#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に表示する場合以下のような感じになります。

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)

instruments

XcodeのInstrumentsを起動

activitymonitor

ActivityMonitorを選択し起動

iphone

左上の認識端末をMacにつないでいる端末を選択

app

Installed Appsからアプリを選択

rec

録画ボタンを選択し、アプリを起動する

memory

下の一覧からProcessNameがアプリ名のものを探し、

その列のRealMemが使用しているメモリ値

 

こちらで確認した値とほぼ一緒でしたので

上記ソースは問題ないかと思います。

 

次回はAndroidについて解説したいと思います。

 

GitHub

ネイティブプラグイン含めてGitHubにアップいたしました。
https://github.com/VENIEGAMES/MemoryChecker-Unity

コメント

  1. […] 【Unity】実機上(ゲーム内)でメモリ使用量を表示してみる 〜iOS編〜 標準Profilerだけに頼らないUnityのプロファイリングに挑んでみる […]

タイトルとURLをコピーしました