Version: 2021.3
GPU 사용 프로파일러 모듈
물리 프로파일러 모듈

메모리 프로파일러 모듈

Unity에서 애플리케이션의 메모리 사용량을 분석하는 방법에는 다음의 두 가지가 있습니다.

  • 메모리 프로파일러 모듈: 애플리케이션이 메모리를 사용하는 위치에 대한 기본 정보를 제공하는 빌트인 프로파일러 모듈
  • 메모리 프로파일러 패키지: 프로젝트에 추가할 수 있는 Unity 패키지입니다. Unity 에디터에 메모리 프로파일러 창을 추가하여 애플리케이션의 메모리 사용량을 더 자세히 분석하는 데 사용할 수 있습니다. 스냅샷을 저장하고 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다.

이 페이지는 빌트인 메모리 프로파일러 모듈에 대한 정보를 다룹니다. 메모리 프로파일러 패키지에 대한 자세한 내용은 메모리 프로파일러 문서를 참조하십시오.

메모리 프로파일러 모듈은 애플리케이션에 할당된 전체 메모리를 나타내는 카운터를 시각화합니다. 메모리 모듈을 사용하여 로드된 오브젝트의 수와 카테고리별로 해당 오브젝트가 차지하는 메모리 양 같은 정보를 볼 수 있습니다. 또한 프로파일러 프레임당 GC 할당 수도 확인할 수 있습니다.

에디터에서 메모리 프로파일링

타겟 디바이스에서 애플리케이션을 빌드하고 프로파일링하는 대신 에디터에서 애플리케이션을 프로파일링할 경우 메모리 프로파일러 모듈의 프로파일링 데이터는 릴리스 플랫폼에서 애플리케이션을 실행할 때보다 더 큽니다. Unity 에디터는 메모리를 차지하는 특정 오브젝트를 사용하고 에디터 창 자체도 추가 메모리를 사용하기 때문입니다.

Also, because Unity can’t cleanly separate the memory that the Profiler itself takes up from the Play mode’s memory, memory that the Profiler uses is displayed in the Profiler window. To remind you of this, a warning displays at the top of the Memory Profiler module details pane whenever you have the Profiler target set to Play Mode or Editor. For more precise numbers and memory usage for your application, you should profile your application on the target device and operating system you intend it to run on. For more information, see the documentation on Profiling your application.

차트 카테고리

The Memory Profiler module is divided into categories that display detailed information on where your application spends memory. You can also click a category’s colored legend to toggle its display.

카테고리 설명
Total Allocated 애플리케이션이 사용한 총 메모리 양입니다.
Texture Memory 애플리케이션의 텍스처가 사용한 총 메모리 양입니다.
Mesh Memory 애플리케이션의 메시가 사용한 총 메모리 양입니다.
Material Count 애플리케이션의 머티리얼 인스턴스 수입니다.
Object Count 애플리케이션의 네이티브 오브젝트 인스턴스 수입니다.
GC Used Memory GC 힙이 사용한 메모리 양입니다.
GC Allocated in Frame GC 힙에서 프레임당 할당된 메모리 양입니다.

모듈 세부 정보 창

프로파일러 창 하단에 있는 모듈 세부 정보 창에는 다음과 같은 두 가지 뷰가 있습니다.

  • Simple: 프레임당 메모리 통계의 고수준 개요를 표시합니다.
  • Detailed: 네이티브 오브젝트에 대한 네이티브 레퍼런스와 Unity의 다양한 보조 시스템을 포함하여 네이티브 오브젝트가 사용한 메모리에 대한 자세한 내용이 포함된 메모리 스냅샷을 캡처합니다.

뷰를 변경하려면 모듈 세부 정보 창의 왼쪽 상단에 있는 드롭다운에서 선택합니다.

간단한 뷰

The Simple view displays an overview of how Unity uses memory in real-time on a per-frame basis. It breaks down the total memory that your application uses into a few major categories. The Total value is based on the System Used Memory Profiler counter, which indicates how much memory the operating system (OS) reports as being in use by your application.

일부 프로파일러 데이터가 로드된 간단한 뷰
일부 프로파일러 데이터가 로드된 간단한 뷰

Unity sets some memory pools aside for allocations to avoid asking the operating system for memory too often. The Profiler module displays how much memory Unity reserves, and how much memory Unity used at the time of the Profiler capture.

간단한 뷰는 System Used Memory 프로파일러 카운터 내에 수집된 데이터를 표시합니다. 이는 운영체제가 앱에서 사용 중인 것으로 보고하는 메모리 양을 나타내며 Total Committed Memory 바와 Total Memory Breakdown 바의 전체 값에 해당합니다.

운영체제로부터 애플리케이션의 전체 메모리 크기를 가져올 수 있는 플랫폼에서 System Memory Usage는 0을 초과하고 작업 관리자와 같은 크기입니다.

다음 참조 표에서는 간단한 뷰에서 사용할 수 있는 통계와 해당 프로파일러 카운터, 릴리스 빌드의 가용성에 대해 설명합니다. 이 정보는 ProfilerRecorder API프로파일러 모듈 에디터에서도 제공하므로 커스텀 프로파일러 모듈에 추가할 수 있습니다.

프로퍼티 설명 해당 프로파일러 카운터 릴리스 플레이어 지원 여부
Normalized Total Committed MemoryTotal Memory Breakdown의 차트 크기를 선택한 프레임의 메모리 사용량으로 조정하려면 이 설정을 활성화합니다. 이 설정을 비활성화하면 차트는 프레임 범위 내에서 사용된 총 메모리로 조정됩니다. 이 설정은 프레임마다 메모리의 전체 또는 상대적 양이 어떻게 변하는지 확인하는 데 도움이 될 수 있습니다. 해당 없음 해당 없음
Total Committed Memory Total Committed Memory 바의 길이는 Unity의 메모리 관리자 시스템이 추적한 전체 메모리 양, 사용된 메모리 양, 이 시스템을 통해 추적되지 않은 메모리 양을 나타냅니다. System Used Memory 지원
Tracked Memory (in use / Reserved) Unity가 사용하고 추적하는 전체 메모리 양(in use)과 Unity가 트래킹 목적과 풀 할당을 위해 예약하는 메모리 양(Reserved)을 나타냅니다. Total Used Memory

Total Reserved Memory
지원
Untracked Memory Unity가 사용했지만 추적하지 못한 전체 메모리 양을 나타냅니다. 추적하지 못한 메모리의 몇 가지 예는 다음과 같습니다.

- 네이티브 플러그인 또는 일부 드라이버를 통해 할당된 메모리
- Mono 또는 IL2CPP 타입 메타데이터
- 실행 가능한 코드 및 DLL이 사용하는 메모리

메모리 프로파일러 패키지 및 네이티브 플랫폼 제공업체에서 이러한 추적되지 않은 메모리 양에 대한 자세한 정보를 얻을 수 있습니다.
해당 없음 해당 없음
Total Memory Breakdown Total Committed Memory 바와 동일한 총량을 표시하지만 Unity가 메모리를 할당한 보조 시스템에 따라 고수준 카테고리로 나눕니다.

모든 메모리 시스템이 풀을 사용하거나 사용된 메모리와 예약된 메모리를 구분하는 것은 아닙니다. 구분되어 있는 항목은 사용된 메모리와 예약된 메모리 양 두 가지 숫자를 표시합니다. 사용된 메모리가 예약된 메모리와 동일한 단위(예: B, MB, GB)를 공유하지 않는 경우 단위를 표시하고, 그렇지 않으면 생략합니다.
System Used Memory 지원
Managed Heap (in use / Reserved) The used heap size and total heap size that managed code uses. This memory is garbage collected. GC Used Memory

GC Reserved Memory
지원
Graphics & Graphics Driver 드라이버가 텍스처, 렌더 타겟, 셰이더 및 메시 데이터에 사용하는 추정 메모리 사용량입니다. Gfx Used Memory

Gfx Reserved Memory
지원 안 함
오디오(Audio) 오디오 시스템의 추정 메모리 사용량입니다. Audio Used Memory

Audio Reserved Memory
지원
Video 비디오 시스템의 추정 메모리 사용량입니다. Video Used Memory

Video Reserved Memory
지원
Other Displays native memory that Unity tracks, but isn’t reported under a specific counter.

To get more information on the makeup of this or the other categories, take a snapshot in the Detailed view or with the Memory Profiler package.

Important: The Other category doesn’t directly map to the Other group in the Detailed view. In this view, Other contains the remainder of the native memory that was not used for the GPU side of graphics memory, the Profiler, Audio, or Video memory.
해당 없음 해당 없음
Profiler 프로파일러 기능이 시스템에서 사용하고 예약하는 메모리입니다. Profiler Used Memory

Profiler Reserved Memory
지원
Objects stats 일반적으로 메모리에서 높은 비율을 차지하는 에셋 타입의 오브젝트(텍스처, 메시, 머티리얼, 애니메이션 클립) 메모리에 축적된 크기와 인스턴스 양(에셋, 게임 오브젝트, 씬 오브젝트)을 함께 표시합니다.

참고: 텍스처와 메시 메모리는 Total Memory Breakdown 뷰의 Graphics & Graphics Driver 통계에 직접 매핑되지 않습니다. 이는 해당 메모리 중 일부가 Total Memory Breakdown 바의 Other 카테고리에 속할 수도 있기 때문입니다.
Object Count 지원 안 함
Textures 로드된 총 텍스처 수와 해당 텍스처가 사용하는 메모리 양입니다. Texture Count

Texture Memory
지원 안 함
Meshes 로드된 총 메시 수와 해당 메시가 사용하는 메모리 양입니다. Mesh Count

Mesh Memory
지원 안 함
Materials 로드된 총 머티리얼 수와 해당 머티리얼이 사용하는 메모리 양입니다. Material Count

Material Memory
지원 안 함
Animation Clips 로드된 총 애니메이션 클립 수와 해당 애니메이션 클립이 사용하는 메모리 양입니다. AnimationClip Count

AnimationClip Memory
지원 안 함
Assets 로드된 총 에셋 수입니다. Asset Count 지원 안 함
Game Objects 씬에서 전체 게임 오브젝트 인스턴스 수입니다. GameObject Count 지원 안 함
씬 오브젝트(Scene Objects) 전체 동적 ’UnityEngine.Objects’의 수입니다. 이 숫자에는 게임 오브젝트 수와 전체 컴포넌트 수, 씬에서 에셋이 아닌 모든 것이 포함됩니다. Scene Object Count 지원 안 함
GC allocated in frame Displays the amount of managed allocations in the selected frame, and their total size in bytes. GC Allocation In Frame Count

GC Allocated In Frame
지원 안 함

플레이어의 가용성

ProfilerRecorder API를 사용하여 플레이어에서 메모리 프로파일러 모듈의 카운터에 액세스할 수 있습니다. 다음 예제에는 Total Reserved Memory, GC Reserved Memory, System Used Memory 지표를 수집하고 GUI.TextArea로 표시하는 간단한 스크립트가 포함되어 있습니다. 메모리 프로파일러 모듈 정보는 ProfilerCategory.Memory 프로파일러 카테고리에 속합니다.

using System.Text;
using Unity.Profiling;
using UnityEngine;

public class MemoryStatsScript : MonoBehaviour
{
    string statsText;
    ProfilerRecorder totalReservedMemoryRecorder;
    ProfilerRecorder gcReservedMemoryRecorder;
    ProfilerRecorder systemUsedMemoryRecorder;

    void OnEnable()
    {
        totalReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");
        gcReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Reserved Memory");
        systemUsedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "System Used Memory");
    }

    void OnDisable()
    {
        totalReservedMemoryRecorder.Dispose();
        gcReservedMemoryRecorder.Dispose();
        systemUsedMemoryRecorder.Dispose();
    }

    void Update()
    {
        var sb = new StringBuilder(500);
        if (totalReservedMemoryRecorder.Valid)
            sb.AppendLine($"Total Reserved Memory: {totalReservedMemoryRecorder.LastValue}");
        if (gcReservedMemoryRecorder.Valid)
            sb.AppendLine($"GC Reserved Memory: {gcReservedMemoryRecorder.LastValue}");
        if (systemUsedMemoryRecorder.Valid)
            sb.AppendLine($"System Used Memory: {systemUsedMemoryRecorder.LastValue}");
        statsText = sb.ToString();
    }

    void OnGUI()
    {
        GUI.TextArea(new Rect(10, 30, 250, 50), statsText);
    }
}

다음 스크린샷은 Tanks! 튜토리얼 프로젝트에 스크립트를 추가한 결과를 보여줍니다.

오버레이된 메모리 정보가 표시된 Tanks! 튜토리얼
오버레이된 메모리 정보가 표시된 Tanks! 튜토리얼

이 정보는 위의 표에 있는 다른 고수준 카운터와 마찬가지로 릴리스 플레이어에서 사용할 수 있습니다. 프로파일러 창의 커스텀 모듈에서 선택한 메모리 카운터를 보려면 모듈 에디터를 사용하여 차트를 구성하십시오.

세부 정보 뷰

세부 정보 뷰는 애플리케이션의 현재 상태에 대한 스냅샷을 제공합니다. Take Sample 버튼을 선택하여 현재 타겟에 대한 자세한 메모리 사용량을 캡처할 수 있습니다. 이 데이터를 가져오는 데 프로파일러 시간이 걸리므로 세부 정보 뷰는 실시간 세부 정보를 제공하지 않습니다. 프로파일러가 샘플을 수집한 후 프로파일러 창에 애플리케이션의 메모리 사용량을 더 자세히 살펴볼 수 있는 리스트 뷰가 표시됩니다.

세부 정보 메모리 모듈 뷰
세부 정보 메모리 모듈 뷰

모듈 세부 정보 창 상단에서 Gather Object References 설정을 활성화하여 스냅샷 시점에 오브젝트를 참조하는 항목에 대한 정보를 수집합니다. 프로파일러 창의 오른쪽에 이 정보를 표시합니다.

리스트 뷰는 메모리를 사용하는 오브젝트를 다음 카테고리로 구분합니다.

  • Other: 에셋, 게임 오브젝트 또는 컴포넌트가 아닌 오브젝트입니다. Unity가 다양한 시스템에 사용하는 메모리 양 등과 같은 정보가 여기에 표시됩니다.
  • Not Saved: DontSave로 표시된 게임 오브젝트
  • Builtin Resources: Unity 에디터 리소스 또는 Unity 기본 리소스(예: 그래픽스 설정의 항상 포함된 셰이더 리스트에 추가한 셰이더).
  • Assets: 사용자 또는 네이티브 코드에서 참조된 에셋입니다.
  • Scene Memory: 오브젝트 및 연결된 컴포넌트

에셋 또는 씬 메모리 리스트에서 게임 오브젝트를 클릭하면 Unity는 프로젝트 뷰 또는 씬 뷰에서 강조 표시합니다.

참고: Other 카테고리에서 System.ExecutableAndDlls에 보고된 메모리는 읽기 전용 메모리입니다. 운영체제는 필요에 따라 해당 페이지를 폐기하고 나중에 파일 시스템에서 다시 로드할 수 있습니다. 그러면 메모리 사용량이 줄어들고 애플리케이션이 너무 많은 메모리를 사용하는 경우 운영체제에서 해당 애플리케이션을 종료하기로 결정하는 직접적인 원인이 되지 않습니다. 일부 페이지는 동일한 프레임워크를 사용하는 다른 애플리케이션과 공유될 수도 있습니다.

GPU 사용 프로파일러 모듈
물리 프로파일러 모듈