# 低レベルのネイティブプラグイン用 Memory Manager API

> Access Unity's memory manager and track memory usage from native plug-ins.

`IUnityMemoryManager` メモリマネージャー API は、Unity のメモリ管理とメモリプロファイリングをネイティブプラグインで使用できるようにする C++ インターフェースです。

この API を使用すると、以下が行えます。

* メモリアロケーターを通して Unity のメモリマネージャーにアクセスできます。
* Unity の Memory Profiler パッケージを使用して、プラグインのメモリ使用状況を追跡できます。

これらの機能によって、プラグインのメモリ割り当ての管理とプロファイリングが (C++ でこれと同等のメモリ管理メソッドを使用するよりも) 簡単に行えます。

プラグイン API は、`IUnityMemoryManager.h` ヘッダーで宣言される、IUnityMemoryManager インターフェースによって提供されます。API の完全なリファレンスは、このファイルにあります。ヘッダーファイルを見つけるには、以下を行います。

* Windows の場合は、インストールされた Unity の `<UnityInstallPath>\Editor\Data\PluginAPI` フォルダー内にこのヘッダーが保存されます。
* macOS の場合は、Unity アプリケーションを右クリックし、Show Package Contents を選択してください。ヘッダーは `Contents\PluginAPI` にあります。

この API を効果的に使用するためには、以下の概念に関する理解が必要です。

* [C++ ポインター](https://learn.microsoft.com/en-us/cpp/cpp/pointers-cpp?view=msvc-170)
* [Unity のメモリ](/engine/6000.0/manual/analysis/performance-memory-overview.md)
* [Memory Profiler パッケージ](https://docs.unity3d.com/Packages/com.unity.memoryprofiler@latest)
* [メモリアロケーターのカスタマイズ](/engine/6000.0/manual/analysis/performance-memory-overview/native-allocators/memory-allocator-customization.md)
* [定義済みマクロ](https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170)

## Unity でのメモリ使用状況の追跡

プラグインのメモリ使用量を追跡するには、[Memory Profiler パッケージ](https://docs.unity3d.com/Packages/com.unity.memoryprofiler@latest) を使用してスナップショットを作成し、[All Of Memory タブ](https://docs.unity3d.com/Packages/com.unity.memoryprofiler@latest/index.html?subfolder=/manual/all-memory-tab.html) でそのスナップショットを開きます。`IUnityMemoryManager` を使用してメモリを割り当てると、Memory Profiler に、プラグインのメモリ割り当てが (各アロケーターの作成時にアサインした領域とオブジェクトの名前の下に) 表示されます。

以下のスクリーンショットでは、Memory Profiler パッケージウィンドウに、`IUnityMemoryManager` API でメモリを割り当てられたネイティブプラグインの、メモリ使用量が表示されています。この例では、areaName パラメーターを "MyNativePlugin"、objectName パラメーターを "MyPluginAllocator" として **CreateAllocator** メソッドが呼び出されています。詳細については、[CreateAllocator](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native-plugin-interface/low-level-native-plugin-memory-manager-api/reference.md#create-allocator) を参照してください。


**Memory Profiler パッケージウィンドウに、Plugin Backend Allocator というユーザー定義のアロケーターのメモリ使用量が表示されています。:**
![](/api/media?file=/engine/6000.0/media/images/native-plugin-memory-snapshot.png)

詳細については、[スナップショット](https://docs.unity3d.com/Packages/com.unity.memoryprofiler@latest/index.html?subfolder=/manual/snapshots.html) を参照してください。

## メモリ管理の制限

この API を使用すると、ネイティブプラグインの開発時に Unity のメモリ管理システムが使用できるようになります。これには上述のとおり大きな利点がありますが、制限がないわけではありません。Unity のメモリ管理システムには以下の特徴があります。

* 自動では管理を行いません。メモリの割り当てと解除は自分で行う必要があります。
* ガベージコレクターによって追跡されず、クリーンアップされません。

ネイティブ C++ のメモリは管理されないため、アプリケーションに必要なメモリを全て把握しておく必要があります。これには、割り当てるメモリの量を適切に選択することや、不要になったメモリの割り当てを確実に解除することが含まれます。

`IUnityMemoryManager` API を使用する場合、割り当てのたびに仮想呼び出しが必要になるため、パフォーマンスへの影響があります。このパフォーマンスへの影響を最小限に抑えるには、この API を使用して、大きなメモリブロックを低い頻度で割り当てます。小さい頻繁な割り当てを処理するには、この API を使用して単一の大きなブロックを割り当てた上で、独自のコードを記述してこのブロック内のメモリを管理します。小さい頻繁な割り当てには、この API を使用しないでください。

## 追加リソース

* [ネイティブプラグインインターフェース](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native-plugin-interface.md) - この API の継承元のベースインターフェースに関する説明です。
* [ネイティブプラグイン](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md) - ネイティブプラグインとは何かの説明です。
* [メモリアロケーターのカスタマイズ](/engine/6000.0/manual/analysis/performance-memory-overview/native-allocators/memory-allocator-customization.md) - Unity の内部的なメモリアロケーターのカスタマイズ方法を説明しています。
