PART 5 · 강의 1/4

GC 튜닝 파라미터

gc.* 콘솔 변수, TimeLimitSeconds, MaxObjectsInGame을 프로젝트에 맞게 최적화합니다

SECTION 01

GC 타이밍 튜닝

GC 실행 빈도와 시간 제한 설정

타이밍 관련 핵심 변수

DefaultEngine.ini ; GC 실행 간격 (초) gc.TimeBetweenPurgingPendingKillObjects=60.0 ; 낮으면: 메모리 효율적, GC 빈번 ; 높으면: GC 드묾, 메모리 사용 증가 ; 권장: 30~120 (프로젝트 규모에 따라) ; Incremental GC 프레임당 시간 제한 gc.TimeLimitSeconds=0.002 ; 60fps: 0.002 (2ms) - 프레임의 12% ; 30fps: 0.004 (4ms) - 프레임의 12% ; 120fps: 0.001 (1ms) - 프레임의 12% ; Incremental 실패 시 Full GC까지 재시도 횟수 gc.NumRetriesBeforeForcingGC=10 ; 높이면: Full GC 빈도 감소, 메모리 일시 증가
플랫폼별 권장 설정

플랫폼별로 다른 GC 설정을 적용하려면 플랫폼별 .ini 파일을 사용합니다:

  • WindowsEngine.ini - PC
  • PS5Engine.ini - PlayStation 5
  • XSXEngine.ini - Xbox Series X
  • AndroidEngine.ini - Android
SECTION 02

객체 제한과 메모리 설정

UObject 수와 메모리 한계 조정

객체 수 제한 변수

변수기본값조정 기준
gc.MaxObjectsInGame2,162,688게임 런타임 최대 UObject 수. 초과 시 경고.
gc.MaxObjectsInEditor12,582,912에디터 최대 UObject 수.
gc.MaxObjectsNotConsideredByGC0DisregardForGC 풀 크기. 엔진 초기화 객체.
gc.SizeOfPermanentObjectPool0영구 객체 풀 크기 (바이트).
C++ // 런타임에서 현재 객체 수 확인 int32 NumObjects = GUObjectArray.GetObjectArrayNum(); int32 MaxObjects = GUObjectArray.GetObjectArrayEstimatedAvailable(); UE_LOG(LogGC, Log, TEXT("Objects: %d / Max: %d (%.1f%%)"), NumObjects, MaxObjects, (float)NumObjects / MaxObjects * 100.f); // 객체 수가 80%를 초과하면 경고 if (NumObjects > MaxObjects * 0.8f) { UE_LOG(LogGC, Warning, TEXT("UObject count approaching limit!")); }
SECTION 03

Cluster와 Incremental 설정

고급 GC 모드의 세부 설정

Cluster GC 튜닝

DefaultEngine.ini ; 클러스터 GC 활성화 gc.CreateGCClusters=True ; 최소 클러스터 크기 (이 수 이상이어야 클러스터 생성) gc.MinGCClusterSize=5 ; Incremental 관련 gc.AllowIncrementalReachability=True gc.IncrementalBeginDestroyEnabled=True ; Actor 정리 관련 gc.ActorClusteringEnabled=True gc.BlueprintClusteringEnabled=True

GC 타이밍 제어 API

C++ // GC 지연 (중요 게임플레이 중) GEngine->DelayGarbageCollection(); // 강제 GC 실행 (레벨 전환 등) CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS); // 강제 Full GC (Incremental 무시) CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS, true); // 특정 시점에 GC 트리거 GetWorld()->ForceGarbageCollection(true); // GC 진행 중인지 확인 if (IsGarbageCollecting()) { // UObject 생성/파괴 불가 }
SECTION 04

실전 튜닝 가이드

프로젝트 유형별 GC 설정 권장사항

프로젝트 유형별 설정

프로젝트TimeLimitSecondsGC 간격Cluster특이사항
오픈월드 RPG0.00260sONLevel Streaming GC 타이밍 조절
FPS/TPS0.00130sON투사체 Pooling 필수
RTS/전략0.003120sON대량 유닛 Batch Destroy
모바일0.00345sON메모리 제한 주의
VR0.000530sON매우 엄격한 프레임 예산
VR 프로젝트 GC 주의

VR은 90fps(11ms 프레임 예산)가 필수입니다. GC에 0.5ms 이상 사용하면 안 됩니다. VR에서는 Object Pooling 최대 활용, 레벨 전환 시에만 Full GC, 런타임 UObject 생성 최소화가 핵심입니다.

SUMMARY

핵심 요약

이 강의에서 배운 내용
  • gc.TimeLimitSeconds는 프레임 예산의 ~12%를 GC에 할당하는 것이 권장됩니다
  • gc.MaxObjectsInGame은 프로젝트 규모에 맞게 조정하며, 80% 임계치 모니터링이 필요합니다
  • Cluster + Incremental을 모두 활성화하는 것이 대부분의 프로젝트에 최적입니다
  • DelayGarbageCollection()으로 중요 순간에 GC를 지연할 수 있습니다
  • 플랫폼별 .ini 파일로 각 플랫폼에 맞는 GC 설정을 적용합니다
PRACTICE

도전 과제

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

실습 1: 핵심 GC 파라미터 조절 실험

gc.TimeBetweenPurgingPendingKillObjects, gc.NumRetriesBeforeForcingGC, gc.MaxObjectsNotConsideredByGC 등의 파라미터를 콘솔에서 변경하면서 GC 빈도와 히치 크기의 변화를 stat gc로 관찰하세요.

실습 2: 프로젝트별 최적 GC 설정 도출

DefaultEngine.ini의 [/Script/Engine.GarbageCollectionSettings] 섹션에서 GC 파라미터를 설정하세요. 60fps 타겟 프로젝트에서 GC 히치가 16ms를 초과하지 않도록 TimeLimitSeconds와 관련 파라미터를 튜닝하세요.

심화 과제: 동적 GC 파라미터 조절 시스템

게임 상태(메뉴, 로딩, 게임플레이, 컷씬)에 따라 GC 파라미터를 동적으로 조절하는 시스템을 구현하세요. IConsoleVariable::Set()으로 런타임 파라미터를 변경하고, 각 상태별 최적 설정 프리셋을 설계하세요.