Unity/Memory

Memory Profiler

SniKuz 2024. 7. 19. 16:06

목차

 

Memory Profiler

Profiling

각 플랫폼은 메모리 제한이 있을 수 있습니다. 예를들어 Xbox One 본체는 포그라운드에서 실행되는 게임의 메모리를 최대 5GB로 제한합니다. 이때문에 해당 플랫폼 개발자 문서를 보면서 가장 낮은 하드웨어에 맞게 고민을 해야합니다.

프로파일링은 2가지 대표적인 방식이 있습니다.

● Sample-based Profiling
앱에서 수행 중인 작업에 대한 통계 데이터를 수집하여 분석하는 방식으로, 'N' 나노초마다 Call stack을 조사해 이를 토대로 함수가 호출된 시간, 어떤 함수에 의해 호출되었는지 등을 파악합니다. 샘플링 빈도와 정확도가 비례하고 빈도수가 높을수록 더 높은 오버헤드가 발생됩니다. 일반적인 네이티브 프로파일러의 방식입니다.

● Instrument Profiling
'프로파일러 마커'를 추가해 코드를 계측합니다. 각 마커의 코드의 시작/종료 이벤트 스트림을 캡처합니다. 너무 많은 오버헤드를 발생시키지 않으며 정보 유실이 없습니다. 대신 마커가 정의되지 않은 경우 계측되지 않습니다. Unity 프로파일러는 계측 기반으로, 대부분의 Unity API에 마커가 설정되어 있습니다. 

프로파일링 핵심 : 병목 현상을 최적화 대상으로 식별하는 것

 

 

Memory Profiler Unity

Unity에서 메모리 사용량을 분석하는 방법으로 2가지가 있습니다. 

  • 메모리 프로파일러 모듈 : Built-in Profiler 모듈로 애플리케이션의 메모리에 간단한 뷰를 제공합니다. (Ctrl+7 단축키)
  • 메모리 프로파일러 패키지 : 메모리 사용량을 더 자세히 분석할 수 있는 Unity 패키지입니다. 스냅샷을 저장하고 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다.

프로파일러를 사용해 스레드 사용, 렌더링, 로드된 오브젝트의 수, 메모리 양, 프레임 당 GC할당 등을 확인할 수 있습니다. 
Editor Loop(1프레임) 단위로 300프레임을 기록하며, File > Preferences > Profiler에서 변경할 수 있습니다.

에디터에서 애플리케이션을 프로파일링할 경우 에디터가 차지하는 메모리가 있기 때문에 실제 릴리스 애플리케이션보다 더 많은 메모리가 표시됩니다. 좀 더 정확한 정보를 위해서는 프로파일러를 Edit Mode에서 Play Mode로 변경하거나(default : Play Mode) 타겟 디바이스와 운영체제에서 애플리케이션 프로파일링🔗을 해야합니다. Build 시 Deep Profiling Support 옵션을 사용하면 C# 모든 스크립팅 메서드 호출에 시작 및 끝 마커를 자동으로 삽입해 스크립팅 측면에서 전체 프로파일링 세부 정보를 제공합니다.

 

Memory Profiler Module - Simple

Unity는 OS에 너무 자주 메모리를 요청하지 않도록 일부 메모리 풀을 할당용으로 따로 설정합니다.
간단한 뷰는 System Used Memory Profiler Counter 내에 수집된 데이터를 표시합니다. Profiler Counter API를 이용해 커스텀 정보도 표현할 수 있는 것 같습니다.

  • Total Committed Memory : Unity 메모리 관리자 시스템이 추적한 전체 메모리 양, 사용된 메모리 양, 이 시스템을 통해 추적되지 않은 메모리 양을 나타냅니다. 
  • Tracked Memory (In use / Reserved) : Unity가 사용하고 추적하는 전체 메모리양(In use)과 Unity가 메모리 사용량 분석 등 트래킹 목적과 풀 할당을 위해 미리 예약하는 메모리 양(Reserved)을 나타냅니다.
  • UnTracked Memory : Unity가 사용했지만 추적하지 못한 전체 메모리 양을 나타냅니다. 네이티브 플러그인이나 드라이버를 통해 할당된 메모리, Mono 또는 IL2CPP 타입 메타 데이터, IL2CPP가 사용하는 가상 머신 메모리, 특정 플랫폼에서 실행 가능한 코드와 DLL, 애플리케이션 스택 메모리 등이 있습니다.
  • Total Memory Breakdown : Total Committed Memory를 카테고리 별로 표현한 것입니다.
  • Managed Heap(In use / Reserved) : 관리되는 힙이며 GC에 의해 수집됩니다.
  • Other : Unity가 추적하지만 특정 프로파일러 카운터에서 보고되지 않는 네이티브 메모리를 표시합니다. 이는 그래픽, 프로파일러, 오디오 등에서 사용되지 않는 네이티브 메모리도 포함됩니다. 그래서 Detailed View에서 Other 그룹은 Other에 직접 매핑되지 않습니다. 
    자세한 정보를 얻으려면 Detailed View를 보거나 메모리 프로파일러 패키지에서 스냅샷을 찍을 수 있습니다.

 

Memory Profiler - Snapshot

메모리 프로파일러 패키지를 통해 스냅샷을 찍어 더 자세히 메모리를 분석할 수 있습니다. 또, 스냅샷을 비교해서 볼 수도 있습니다.

Summary, Unity Objects, All of Memory 중에서 Unity Objects 뷰를 가장 자주 사용됩니다. 텍스처, 셰이더, 폰트 등 메모리에 로드되는 오브젝트의 주요 유형을 모두 표시합니다.

 

프로파일러를 통해 최적화할 부분을 찾아내고, 프로파일링 하는 과정을 알아둘 필요가 있습니다.
상세한 프로파일링은 해당 유니티 유튜브 링크🔗에서 확인

 

참고자료

더보기