# 로우레벨 네이티브 플러그인을 위한 메모리 관리자 API

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

`IUnityMemoryManager` 메모리 관리자 API는 네이티브 플러그인에서 Unity의 메모리 관리 및 메모리 프로파일링을 사용할 수 있는 C++ 인터페이스입니다.

이 API를 통해 다음이 가능합니다.

* 메모리 할당자를 통해 Unity의 메모리 관리자에 액세스
* Unity의 메모리 프로파일러 패키지를 통해 플러그인의 메모리 사용량 추적

이러한 기능을 사용하면 동등한 C++ 메모리 관리 메서드와 비교했을 때 플러그인의 메모리 할당을 더 쉽게 관리하고 프로파일링할 수 있습니다.

플러그인 API는 `IUnityMemoryManager.h` 헤더에 선언된 IUnityMemoryManager 인터페이스를 통해 제공됩니다. API 대한 전체 레퍼런스는 이 파일에서 확인할 수 있습니다. 헤더 파일을 찾는 법은 다음과 같습니다.

* Windows의 경우 Unity는 헤더를 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)
* [메모리 프로파일러 패키지](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에서 메모리 사용 추적

플러그인의 메모리 사용량을 추적하려면 [메모리 프로파일러 패키지](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`를 사용하여 메모리를 할당하면 메모리 프로파일러는 각 할당자를 생성할 때 지정한 영역과 오브젝트 이름 아래에 플러그인의 메모리 할당을 표시합니다.

아래 스크린샷은 네이티브 플러그인이 `IUnityMemoryManager` API로 할당받은 메모리에서 사용하는 메모리 양이 메모리 프로파일러 패키지 창에 표시되는 모습입니다. 이 예시에서는 **CreateAllocator** 메서드가 호출되었으며, "MyNativePlugin"을 areaName 파라미터로, "MyPluginAllocator"를 objectName 파라미터로 사용했습니다. 자세한 내용은 [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 패키지 창.:**
![](/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의 메모리 관리 시스템의 특성으로 인한 한계도 존재합니다.

* 자동으로 관리되지 않으므로 사용자가 직접 메모리를 할당하고 할당 해제해야 합니다.
* 가비지 컬렉터(Garbage Collector)가 추적 및 청소하지 않습니다.

네이티브 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의 내부 메모리 할당자를 커스터마이징하는 방법을 설명합니다.
