Unity×iOS

【Unity×iOS】メモリ使用量を取得する方法|ネイティブプラグインでリアルタイム監視

iOSアプリ開発では、メモリの使いすぎがクラッシュやパフォーマンス低下の大きな原因になります。
Unityアプリでも、リアルタイムでメモリ使用量を取得して監視できれば、より安定したゲーム・アプリ運営が可能になります。
この記事では、UnityからiOSの実メモリ使用量を取得する方法を、コピペOKのプラグイン+スクリプト形式で詳しく解説します!

この記事で分かること

  • Unity標準APIだけではiOSメモリを完全に監視できない理由
  • iOSネイティブ(mach API)を使った正確なメモリ取得方法
  • 【コピペOK】Objective-C++プラグイン+Unity C#コード
  • メモリ監視を活用したアプリ安定化・クラッシュ防止テクニック

なぜUnity標準APIだけではダメなのか?

Unityには標準で

UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong();

という関数がありますが、
これはあくまでUnityエンジン内部ヒープ領域のメモリ使用量のみを示します。

一方、iOSシステム側では、

  • テクスチャ
  • ネイティブコード使用メモリ
  • システムリソース

など、Unity外のリソースもまとめた「本当の使用量」が問題になります。
このため、正確な監視にはiOSのネイティブAPI(mach API)
を使う必要があります。

【コピペOK】iOSメモリ使用量取得プラグイン作成手順

.mmファイルを作成する

まず、
Assets/Plugins/iOS/MemoryUsagePlugin.mm
を作成し、以下のコードを記述します。

#import <mach/mach.h>

extern "C" {

size_t GetUsedMemory()
{
    struct task_vm_info info;
    mach_msg_type_number_t size = TASK_VM_INFO_COUNT;
    kern_return_t kerr = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&info, &size);
    if (kerr == KERN_SUCCESS)
    {
        return info.phys_footprint; // 実メモリ使用量(バイト単位)
    }
    else
    {
        return 0;
    }
}
}

ポイント

  • task_info()を使って、物理メモリフットプリントを取得
  • 単位はバイト(B)なので、後でMBやGBに換算して表示します

Unity側C#スクリプトを書く

これで、MemoryUsagePlugin.UsedMemoryMB
を読むだけで、現在のiOSメモリ使用量(MB単位)が取得できるようになります!

using System.Runtime.InteropServices;
using UnityEngine;

public static class MemoryUsagePlugin
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern ulong GetUsedMemory();
#else
    private static ulong GetUsedMemory() => 0;
#endif

    /// <summary>
    /// 使用中メモリ(MB単位)
    /// </summary>
    public static float UsedMemoryMB => GetUsedMemory() / (1024f * 1024f);
}

使用例(メモリ使用量を表示する)

例えば、ゲーム中にメモリ量をモニタリングしたいなら:

using UnityEngine;
using UnityEngine.UI;

public class MemoryMonitor : MonoBehaviour
{
    public Text memoryText;

    void Update()
    {
        float usedMB = MemoryUsagePlugin.UsedMemoryMB;
        memoryText.text = $"Memory Usage: {usedMB:F1} MB";
    }
}

これだけで、リアルタイムにiOS実メモリ使用量を監視できます!

メモリ監視を活用したアプリ安定化アイデア

  • 使用メモリが一定量(例:500MB)を超えたら警告メッセージ表示
  • メモリ使用量が高いときに自動的にキャッシュ削除不要なリソース解放
  • ローディング画面などで一時的にメモリを測って最適化チューニング

特にiOSでは、メモリが750〜800MBを超えるとアプリクラッシュ(OSによる強制終了)のリスクが高まるため、
メモリ使用量をリアルタイムで管理できることは非常に重要です!

まとめ

項目内容
Unity標準APIは内部メモリのみ取得できる
iOSネイティブ(mach API)で物理メモリ使用量を取得可能
コピペOKプラグイン+Unityスクリプトで簡単監視
メモリ監視はアプリ安定化・クラッシュ防止に直結する

リアルなiOSメモリ使用量を把握できるUnityアプリにして、
より高品質なゲーム・ツールを開発していきましょう!