Version: 2023.1
言語: 日本語
低レベルのネイティブプラグインのシェーダーコンパイラーへのアクセス
IUnityMemoryManager API リファレンス

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

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

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

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

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

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

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

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

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

プラグインのメモリ使用状況を追跡するには、Memory Profiler パッケージ を使用してスナップショットを撮り、All Of Memory タブ でスナップショットを開きます。IUnityMemoryManager を使用してメモリを割り当てると、Memory Profiler に、プラグインのメモリ割り当てが (各アロケーターの作成時にアサインした領域とオブジェクトの名前の下に) 表示されます。

以下のスクリーンショットでは、Memory Profiler パッケージウィンドウに、IUnityMemoryManager API でメモリを割り当てられたネイティブプラグインの、メモリ使用量が表示されています。この例では、areaName パラメーターを “MyNativePlugin”、objectName パラメーターを “MyPluginAllocator” として CreateAllocator メソッドが呼び出されています。詳細は CreateAllocator を参照してください。

Memory Profiler パッケージウィンドウに、Plugin Backend Allocator というユーザー定義のアロケーターのメモリ使用量が表示されています。
Memory Profiler パッケージウィンドウに、Plugin Backend Allocator というユーザー定義のアロケーターのメモリ使用量が表示されています。

詳細は Snapshots を参照してください。

メモリ管理の制限

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

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

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

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

その他の参考資料

低レベルのネイティブプラグインのシェーダーコンパイラーへのアクセス
IUnityMemoryManager API リファレンス