메모리 버짓 설계
플랫폼별 메모리 배분 전략과 모니터링
플랫폼별 메모리 버짓
카테고리별 배분 예시
| 카테고리 | PS5 (8GB) | PC (16GB) |
|---|---|---|
| 엔진 코어 | 500MB | 500MB |
| 렌더 타겟 | 1.5GB | 2GB |
| 텍스처 스트리밍 | 2GB | 4GB |
| 메시/지오메트리 | 1.5GB | 3GB |
| 오디오 | 300MB | 500MB |
| 애니메이션 | 500MB | 1GB |
| 물리/AI | 800MB | 1.5GB |
| 여유/버퍼 | 900MB | 3.5GB |
항상 10-15% 여유를 남겨두세요. 예상치 못한 피크 사용량과 OS 오버헤드를 위한 버퍼입니다.
커스텀 LLM 태그 활용
카테고리별 모니터링
// 헤더에서 선언
LLM_DECLARE_TAG(Weapons);
LLM_DECLARE_TAG(Characters);
LLM_DECLARE_TAG(Environment);
LLM_DECLARE_TAG(UI);
// 소스에서 정의
LLM_DEFINE_TAG(Weapons);
LLM_DEFINE_TAG(Characters);
LLM_DEFINE_TAG(Environment);
LLM_DEFINE_TAG(UI);
// 사용
void UWeaponManager::LoadWeaponAssets()
{
LLM_SCOPE(Weapons);
// 모든 할당이 Weapons 태그로 추적됨
}
# 콘솔에서
stat LLMFULL
# 출력 예시
Weapons: 128.5 MB
Characters: 256.2 MB
Environment: 512.8 MB
UI: 64.3 MB
버짓 초과 대응
메모리 압박 시 전략
단계별 대응
- 1단계 (경고): 텍스처 품질 한 단계 하향, 덜 중요한 에셋 언로드
- 2단계 (위험): LOD 강제 적용, 오디오 품질 감소, 파티클 수 제한
- 3단계 (크리티컬): 비필수 시스템 비활성화, GC 강제 실행
void UMemoryManager::CheckMemoryBudget()
{
float UsedMB = GetTotalMemoryUsage();
float BudgetMB = GetMemoryBudget();
float Ratio = UsedMB / BudgetMB;
if (Ratio > 0.9f)
{
OnMemoryCritical.Broadcast();
}
else if (Ratio > 0.8f)
{
OnMemoryWarning.Broadcast();
}
}
자동화된 메모리 모니터링
CI/CD와 연동한 메모리 검증
메모리 버짓 준수를 수동으로 확인하는 것은 비효율적입니다. 자동화된 테스트와 커맨드렛을 활용하여 빌드 파이프라인에서 메모리를 검증하세요.
// 메모리 버짓 자동 검증 테스트
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMemoryBudgetTest,
"Project.Performance.MemoryBudget",
EAutomationTestFlags::EditorContext |
EAutomationTestFlags::ProductFilter)
bool FMemoryBudgetTest::RunTest(const FString& Params)
{
// 현재 메모리 사용량 조회
FPlatformMemoryStats MemStats =
FPlatformMemory::GetStats();
const int64 BudgetMB = 4096; // 4GB 버짓
const int64 UsedMB =
MemStats.UsedPhysical / (1024 * 1024);
TestTrue(
FString::Printf(TEXT("Memory %lld MB within budget %lld MB"),
UsedMB, BudgetMB),
UsedMB <= BudgetMB
);
return true;
}
// 커맨드렛으로 메모리 리포트 생성
// UE5Editor.exe Project -run=MemReport -AllMemory
UE5의 Gauntlet Automation Framework를 사용하면 실제 게임 실행 중 메모리를 자동으로 기록하고 기준치를 초과하면 빌드를 실패시킬 수 있습니다.
주기적으로 memreport -full 콘솔 명령을 실행하여 Saved 폴더의 MemReports를 비교하세요. 시간이 지남에 따라 증가하는 카테고리가 누수 후보입니다.
핵심 요약
- 메모리 버짓: 플랫폼별로 카테고리 배분 계획
- 여유 버퍼: 항상 10-15% 남겨두기
- 커스텀 LLM 태그: 게임 시스템별 메모리 추적
- 단계별 대응: 경고/위험/크리티컬 레벨 정의
- 자동화 테스트: CI/CD 연동으로 메모리 버짓 자동 검증
- 모니터링: stat LLMFULL, memreport로 실시간 확인
메모리 최적화를 마스터했습니다! 다음 Part에서는 스레딩 및 빌드 최적화를 다룹니다.
도전 과제
배운 내용을 직접 실습해보세요
프로젝트의 주요 시스템(무기, 캐릭터, 환경, UI)에 커스텀 LLM 태그를 등록하고, stat LLMFULL로 각 시스템의 실시간 메모리 사용량을 확인하세요.
FPlatformMemory::GetStats()를 활용하여 메모리 사용률이 80%를 넘으면 Warning, 90%를 넘으면 Critical 이벤트를 브로드캐스트하는 메모리 모니터를 구현하세요.
Automation Test로 메모리 버짓 검증 테스트를 작성하고, Gauntlet을 연동하여 실제 게임 플레이 중 메모리 피크가 목표 버짓(4GB)을 초과하면 빌드가 실패하도록 CI/CD 파이프라인을 구성하세요.