Version: 2020.2
언어: 한국어
GPU 사용 프로파일러 모듈
물리 프로파일러 모듈

메모리 프로파일러 모듈

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

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

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

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

에디터에서 애플리케이션을 프로파일링하면 메모리 모듈의 정보가 에디터의 메모리 사용량을 표시합니다. 이 수치는 일반적으로 릴리스 플랫폼에서 실행할 때보다 더 큽니다. 이는 Unity 에디터에서 실행하면 메모리를 차지하는 특정 오브젝트를 사용하고 에디터 창 자체가 추가 메모리를 사용하기 때문입니다. 또한 프로파일러는 사용하는 메모리도 표시하는데, 이는 Unity가 플레이 모드 플레이어가 사용하는 메모리와 명확하게 분리할 수 없기 때문입니다. 애플리케이션에 대한 더욱 정확한 수치와 메모리 사용량을 확인하려면 프로파일러를 Attach to Player 메뉴를 통해 실행 중인 플레이어에 연결하십시오. 이렇게 하면 타겟 기기의 실제 사용량을 볼 수 있습니다.

차트 카테고리

메모리 모듈은 애플리케이션이 메모리를 소비하는 위치에 대한 자세한 정보를 보여주는 6개의 차트로 구성됩니다. 차트에서 카테고리 순서를 변경할 수 있습니다. 이렇게 하려면 카테고리를 차트 범례에 끌어다 놓으십시오. 카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

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

모듈 세부 정보 창

프로파일러 창 하단에 있는 모듈 세부 정보 창에서는 SimpleDetailed 뷰를 사용할 수 있습니다. 뷰를 변경하려면 모듈 세부 정보 창의 왼쪽 상단에 있는 드롭다운에서 사용할 뷰를 선택하십시오.

간단한 뷰

Simple 뷰에는 Unity의 프레임별 실시간 메모리 사용량에 대한 개요가 나와 있습니다.

Unity는 운영체제에 메모리를 너무 자주 요청하는 것을 방지하기 위해 메모리 풀을 예약합니다. 프로파일러는 예약된 메모리 양과 Unity가 사용하는 메모리 양을 표시합니다.

간단한 메모리 모듈 뷰
간단한 메모리 모듈 뷰

이 정보는 ProfilerRecorder API프로파일러 모듈 에디터를 통해서도 제공되므로 커스텀 프로파일러 모듈에 추가할 수 있습니다.

통계 설명 릴리스 플레이어에서 이용 가능
Total Used Memory Unity가 사용하고 추적하는 총 메모리 값입니다. 지원
Total Reserved Memory Unity가 추적 목적으로 또는 풀 할당을 위해 사용하는 총 예약 메모리 양입니다. 지원
GC Used Memory

GC Reserved Memory
관리되는 코드가 사용하는 사용된 힙 크기 및 총 힙 크기입니다. 이 메모리에 대해 가비지 컬렉션이 수행됩니다. 지원
Gfx Used Memory

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

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

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

Profiler Reserved Memory
프로파일러 기능이 시스템에서 사용하고 예약하는 메모리입니다. 지원
System Used Memory 프로파일러의 값은 운영체제의 작업 관리자에 표시되는 값과 다릅니다. 이는 메모리 프로파일러가 시스템의 모든 메모리 사용량을 추적하지 않기 때문입니다. 여기에는 일부 드라이버와 플러그인에서 사용하는 메모리와 실행 코드에 사용되는 메모리가 포함됩니다.

운영체제에서 애플리케이션의 총 메모리 크기를 확인할 수 있는 플랫폼의 경우 System Memory Usage는 0보다 크며 작업 관리자에서 동일한 크기입니다.
지원
Texture Count

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

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

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

AnimationClip Memory
로드된 총 애니메이션 클립 수와 해당 애니메이션 클립이 사용하는 메모리 양입니다. 지원 안 함
Asset Count 로드된 총 에셋 수입니다. 지원 안 함
GameObject Count 씬의 총 게임 오브젝트 인스턴스 수입니다. 지원 안 함
Scene Object Count 총 동적 UnityEngine.Object 수입니다. 이 수에는 GameObject Count, 총 컴포넌트 수, 그리고 씬에서 에셋이 아닌 모든 항목이 포함됩니다. 지원 안 함
Object Count 애플리케이션이 생성하거나 로드하는 총 네이티브 UnityEngine.Object 수입니다. 이 수에는 Scene Object Count와 모든 에셋의 총 개수가 포함됩니다. 시간이 지남에 따라 이 숫자가 증가하면 애플리케이션이 게임 오브젝트 또는 기타 에셋을 생성하기만 하고 파괴하거나 언로드하지 않는 것입니다. 지원 안 함
GC Allocation In Frame Count

GC Allocated In Frame
관리되는 할당의 양과 총 크기(바이트)입니다. 지원 안 함

플레이어의 가용성

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

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! 튜토리얼

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

세부 정보 뷰

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

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

모듈 세부 정보 창의 상단에서 Gather object references 설정을 활성화하면 스냅샷 시점에 오브젝트를 참조하는 요소에 대한 정보를 수집할 수 있습니다. 프로파일러는 이러한 정보를 창의 오른쪽 면에 표시합니다.

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

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

Assets 또는 Scene Memory 리스트에서 게임 오브젝트를 클릭하면 프로젝트 또는 씬 뷰에서 강조 표시됩니다.

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

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