GC 튜닝 파라미터
gc.* 콘솔 변수, TimeLimitSeconds, MaxObjectsInGame을 프로젝트에 맞게 최적화합니다
GC 타이밍 튜닝
GC 실행 빈도와 시간 제한 설정
타이밍 관련 핵심 변수
; 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- PCPS5Engine.ini- PlayStation 5XSXEngine.ini- Xbox Series XAndroidEngine.ini- Android
객체 제한과 메모리 설정
UObject 수와 메모리 한계 조정
객체 수 제한 변수
| 변수 | 기본값 | 조정 기준 |
|---|---|---|
gc.MaxObjectsInGame | 2,162,688 | 게임 런타임 최대 UObject 수. 초과 시 경고. |
gc.MaxObjectsInEditor | 12,582,912 | 에디터 최대 UObject 수. |
gc.MaxObjectsNotConsideredByGC | 0 | DisregardForGC 풀 크기. 엔진 초기화 객체. |
gc.SizeOfPermanentObjectPool | 0 | 영구 객체 풀 크기 (바이트). |
// 런타임에서 현재 객체 수 확인
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!"));
}
Cluster와 Incremental 설정
고급 GC 모드의 세부 설정
Cluster GC 튜닝
; 클러스터 GC 활성화
gc.CreateGCClusters=True
; 최소 클러스터 크기 (이 수 이상이어야 클러스터 생성)
gc.MinGCClusterSize=5
; Incremental 관련
gc.AllowIncrementalReachability=True
gc.IncrementalBeginDestroyEnabled=True
; Actor 정리 관련
gc.ActorClusteringEnabled=True
gc.BlueprintClusteringEnabled=True
GC 타이밍 제어 API
// GC 지연 (중요 게임플레이 중)
GEngine->DelayGarbageCollection();
// 강제 GC 실행 (레벨 전환 등)
CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS);
// 강제 Full GC (Incremental 무시)
CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS, true);
// 특정 시점에 GC 트리거
GetWorld()->ForceGarbageCollection(true);
// GC 진행 중인지 확인
if (IsGarbageCollecting())
{
// UObject 생성/파괴 불가
}
실전 튜닝 가이드
프로젝트 유형별 GC 설정 권장사항
프로젝트 유형별 설정
| 프로젝트 | TimeLimitSeconds | GC 간격 | Cluster | 특이사항 |
|---|---|---|---|---|
| 오픈월드 RPG | 0.002 | 60s | ON | Level Streaming GC 타이밍 조절 |
| FPS/TPS | 0.001 | 30s | ON | 투사체 Pooling 필수 |
| RTS/전략 | 0.003 | 120s | ON | 대량 유닛 Batch Destroy |
| 모바일 | 0.003 | 45s | ON | 메모리 제한 주의 |
| VR | 0.0005 | 30s | ON | 매우 엄격한 프레임 예산 |
VR은 90fps(11ms 프레임 예산)가 필수입니다. GC에 0.5ms 이상 사용하면 안 됩니다. VR에서는 Object Pooling 최대 활용, 레벨 전환 시에만 Full GC, 런타임 UObject 생성 최소화가 핵심입니다.
핵심 요약
- gc.TimeLimitSeconds는 프레임 예산의 ~12%를 GC에 할당하는 것이 권장됩니다
- gc.MaxObjectsInGame은 프로젝트 규모에 맞게 조정하며, 80% 임계치 모니터링이 필요합니다
- Cluster + Incremental을 모두 활성화하는 것이 대부분의 프로젝트에 최적입니다
- DelayGarbageCollection()으로 중요 순간에 GC를 지연할 수 있습니다
- 플랫폼별 .ini 파일로 각 플랫폼에 맞는 GC 설정을 적용합니다
도전 과제
배운 내용을 직접 실습해보세요
gc.TimeBetweenPurgingPendingKillObjects, gc.NumRetriesBeforeForcingGC, gc.MaxObjectsNotConsideredByGC 등의 파라미터를 콘솔에서 변경하면서 GC 빈도와 히치 크기의 변화를 stat gc로 관찰하세요.
DefaultEngine.ini의 [/Script/Engine.GarbageCollectionSettings] 섹션에서 GC 파라미터를 설정하세요. 60fps 타겟 프로젝트에서 GC 히치가 16ms를 초과하지 않도록 TimeLimitSeconds와 관련 파라미터를 튜닝하세요.
게임 상태(메뉴, 로딩, 게임플레이, 컷씬)에 따라 GC 파라미터를 동적으로 조절하는 시스템을 구현하세요. IConsoleVariable::Set()으로 런타임 파라미터를 변경하고, 각 상태별 최적 설정 프리셋을 설계하세요.