메모리 프로파일러
LLM, memreport, Memory Insights로 메모리 사용량을 분석합니다
Low-Level Memory Tracker (LLM)
엔진 메모리 할당 추적
LLM은 스코프 태그 시스템을 사용하여 언리얼 엔진과 OS의 모든 메모리 할당을 추적합니다.
레벨: 상위 레벨
추적 대상: FMemory::Malloc
레벨: 하위 레벨
추적 대상: OS 전체 할당
# CSV 출력 활성화
UnrealEditor.exe MyProject.uproject -LLMCSV
# 파일 위치: Saved/Profiling/LLM/
# 기본 5초마다 새 라인 기록
# 콘솔 변수로 주기 변경
LLM.LLMWriteInterval 10 # 10초마다 기록
# 기본 LLM 통계
stat LLM
# 전체 LLM 통계 (더 상세)
stat LLMFULL
LLM은 Test/Shipping 빌드에서 완전히 컴파일 아웃됩니다. Test 빌드에서 활성화하려면 Target.build.cs에 다음을 추가하세요:
GlobalDefinitions.Add("ALLOW_LOW_LEVEL_MEM_TRACKER_IN_TEST=1");
커스텀 LLM 태그
시스템별 메모리 추적
커스텀 LLM 태그를 생성하여 시스템별 메모리 사용량을 정확히 추적할 수 있습니다.
// 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"));
memreport 명령어
상세 메모리 리포트 생성
memreport는 현재 메모리 상태를 상세한 텍스트 파일로 저장합니다.
🎭 Object Memory
UObject 클래스별 메모리 사용량
📦 Asset Registry
로드된 에셋 목록
🖼️ Texture Memory
텍스처별 메모리 사용량
🏗️ Mesh Memory
Static/Skeletal Mesh 메모리
memreport #1
memreport #2
# 기본 리포트
memreport
# 전체 리포트 (매우 상세)
memreport -full
# 저장 위치
# Saved/Profiling/MemReports/*.memreport
레벨 로드 전후에 memreport를 각각 실행하여 차이점을 비교하면 해당 레벨의 메모리 풋프린트를 정확히 파악할 수 있습니다.
Memory Insights
Unreal Insights의 메모리 분석
Memory Insights는 Unreal Insights의 일부로, 시간에 따른 메모리 할당/해제를 시각화합니다.
📈 Allocation Timeline
시간에 따른 메모리 할당 그래프
급격한 증가 구간 식별
🏷️ LLM Tags View
LLM 태그별 메모리 사용량 분포
시스템별 사용량 확인
📚 Callstacks
개별 할당의 콜스택
메모리 누수 원인 추적
🔴 Live Allocations
해제되지 않은 할당 목록
잠재적 누수 탐지
# 메모리 트레이스 활성화
-trace=default,memory,metadata,assetmetadata -llm
# Unreal Insights에서 Memory 탭 확인
게임 세션 동안 Memory Insights를 기록하고, Live Allocations에서 지속적으로 증가하는 할당 패턴을 찾으면 메모리 누수를 발견할 수 있습니다.
핵심 요약
- LLM: 스코프 태그 기반 메모리 추적,
stat LLM으로 확인 - 커스텀 LLM 태그:
LLM_DECLARE_TAG,LLM_DEFINE_TAG,LLM_SCOPE - memreport -full: 상세 메모리 리포트를 텍스트 파일로 저장
- Memory Insights: 시간에 따른 메모리 변화, 콜스택, 누수 탐지
- 트레이스 명령:
-trace=default,memory,metadata -llm
프로파일링 도구를 마스터했습니다! 다음 Part에서는 CPU 최적화의 핵심인 Tick 최적화, Significance Manager, Object Pooling을 다룹니다.
도전 과제
배운 내용을 직접 실습해보세요
memreport -full 명령을 게임 시작 시와 5분 플레이 후에 각각 실행하세요. 두 리포트를 비교하여 증가한 메모리 카테고리를 식별하고 잠재적 메모리 누수 후보를 정리합니다.
stat LLM과 stat LLMFULL 명령으로 카테고리별 메모리 사용량을 실시간 확인하세요. Texture, Mesh, Audio 중 가장 많은 메모리를 차지하는 카테고리를 파악합니다.
Unreal Insights의 Memory 뷰에서 -trace=default,memory -llm 옵션으로 캡처한 데이터를 분석하세요. 시간대별 메모리 할당/해제 패턴을 추적하고, 가비지 컬렉션 타이밍과 메모리 피크의 상관관계를 분석합니다.