PART 1 · 강의 4/4

메모리 프로파일러

LLM, memreport, Memory Insights로 메모리 사용량을 분석합니다

01

Low-Level Memory Tracker (LLM)

엔진 메모리 할당 추적

LLM은 스코프 태그 시스템을 사용하여 언리얼 엔진과 OS의 모든 메모리 할당을 추적합니다.

📊 LLM 두 가지 트래커
Default Tracker
🔍

레벨: 상위 레벨
추적 대상: FMemory::Malloc

Platform Tracker
🔬

레벨: 하위 레벨
추적 대상: OS 전체 할당

🚀 LLM 활성화 및 확인 흐름
1
-LLMCSV
명령줄 옵션
2
게임 실행
데이터 수집
3
stat LLM
실시간 확인
4
CSV 분석
오프라인 분석
⭐ LLM 활성화 명령
코드 숨기기
# CSV 출력 활성화 UnrealEditor.exe MyProject.uproject -LLMCSV # 파일 위치: Saved/Profiling/LLM/ # 기본 5초마다 새 라인 기록 # 콘솔 변수로 주기 변경 LLM.LLMWriteInterval 10 # 10초마다 기록
인게임 stat 명령어
코드 보기
# 기본 LLM 통계 stat LLM # 전체 LLM 통계 (더 상세) stat LLMFULL
빌드 주의사항

LLM은 Test/Shipping 빌드에서 완전히 컴파일 아웃됩니다. Test 빌드에서 활성화하려면 Target.build.cs에 다음을 추가하세요:
GlobalDefinitions.Add("ALLOW_LOW_LEVEL_MEM_TRACKER_IN_TEST=1");

02

커스텀 LLM 태그

시스템별 메모리 추적

커스텀 LLM 태그를 생성하여 시스템별 메모리 사용량을 정확히 추적할 수 있습니다.

🏷️ LLM 태그 계층 구조 예시
📁 GameSystems
├── 📁 Combat
└── WeaponMesh, Effects, AI
├── 📁 Inventory
└── Items, UI, Icons
└── 📁 World
└── Terrain, Buildings, NPCs
C++ 커스텀 태그 정의
코드 보기
// MyModule.h - 헤더 파일 LLM_DECLARE_TAG(MyCustomTag); LLM_DECLARE_TAG(WeaponSystem); LLM_DECLARE_TAG(InventorySystem); // MyModule.cpp - 소스 파일 LLM_DEFINE_TAG(MyCustomTag); LLM_DEFINE_TAG(WeaponSystem); LLM_DEFINE_TAG(InventorySystem); // 사용 예시 void AWeapon::LoadAssets() { LLM_SCOPE(WeaponSystem); // 이 스코프 내의 모든 메모리 할당은 // WeaponSystem 태그로 추적됨 WeaponMesh = LoadObject<UStaticMesh>(...); }
계층적 태그 정의
코드 보기
// 부모-자식 관계 태그 LLM_DEFINE_TAG(GameSystems, NAME_None, TEXT("GameSystems")); LLM_DEFINE_TAG(Combat, GameSystems, TEXT("Combat")); LLM_DEFINE_TAG(Inventory, GameSystems, TEXT("Inventory"));
03

memreport 명령어

상세 메모리 리포트 생성

memreport는 현재 메모리 상태를 상세한 텍스트 파일로 저장합니다.

📋 memreport 출력 구성

🎭 Object Memory

UObject 클래스별 메모리 사용량

📦 Asset Registry

로드된 에셋 목록

🖼️ Texture Memory

텍스처별 메모리 사용량

🏗️ Mesh Memory

Static/Skeletal Mesh 메모리

🔍 레벨 로드 전후 비교 분석
로드 전
512 MB

memreport #1

로드 후
1.8 GB

memreport #2

차이: 레벨 풋프린트 = 1.3 GB
⭐ memreport 사용법
코드 숨기기
# 기본 리포트 memreport # 전체 리포트 (매우 상세) memreport -full # 저장 위치 # Saved/Profiling/MemReports/*.memreport
활용 팁

레벨 로드 전후에 memreport를 각각 실행하여 차이점을 비교하면 해당 레벨의 메모리 풋프린트를 정확히 파악할 수 있습니다.

04

Memory Insights

Unreal Insights의 메모리 분석

Memory Insights는 Unreal Insights의 일부로, 시간에 따른 메모리 할당/해제를 시각화합니다.

📊 Memory Insights 핵심 분석 기능

📈 Allocation Timeline

시간에 따른 메모리 할당 그래프
급격한 증가 구간 식별

🏷️ LLM Tags View

LLM 태그별 메모리 사용량 분포
시스템별 사용량 확인

📚 Callstacks

개별 할당의 콜스택
메모리 누수 원인 추적

🔴 Live Allocations

해제되지 않은 할당 목록
잠재적 누수 탐지

🔍 메모리 누수 탐지 프로세스
1
트레이스
memory 채널 활성화
2
세션 기록
게임 플레이
3
Live 분석
Live Allocations 확인
4
패턴 식별
증가 패턴 찾기
Memory Insights 트레이스 명령
코드 보기
# 메모리 트레이스 활성화 -trace=default,memory,metadata,assetmetadata -llm # Unreal Insights에서 Memory 탭 확인
메모리 누수 탐지

게임 세션 동안 Memory Insights를 기록하고, Live Allocations에서 지속적으로 증가하는 할당 패턴을 찾으면 메모리 누수를 발견할 수 있습니다.

SUMMARY

핵심 요약

  • LLM: 스코프 태그 기반 메모리 추적, stat LLM으로 확인
  • 커스텀 LLM 태그: LLM_DECLARE_TAG, LLM_DEFINE_TAG, LLM_SCOPE
  • memreport -full: 상세 메모리 리포트를 텍스트 파일로 저장
  • Memory Insights: 시간에 따른 메모리 변화, 콜스택, 누수 탐지
  • 트레이스 명령: -trace=default,memory,metadata -llm
Part 1 완료!

프로파일링 도구를 마스터했습니다! 다음 Part에서는 CPU 최적화의 핵심인 Tick 최적화, Significance Manager, Object Pooling을 다룹니다.

PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 메모리 스냅샷 비교

memreport -full 명령을 게임 시작 시와 5분 플레이 후에 각각 실행하세요. 두 리포트를 비교하여 증가한 메모리 카테고리를 식별하고 잠재적 메모리 누수 후보를 정리합니다.

실습 2: LLM 태그 모니터링

stat LLM과 stat LLMFULL 명령으로 카테고리별 메모리 사용량을 실시간 확인하세요. Texture, Mesh, Audio 중 가장 많은 메모리를 차지하는 카테고리를 파악합니다.

심화 과제

Unreal Insights의 Memory 뷰에서 -trace=default,memory -llm 옵션으로 캡처한 데이터를 분석하세요. 시간대별 메모리 할당/해제 패턴을 추적하고, 가비지 컬렉션 타이밍과 메모리 피크의 상관관계를 분석합니다.