언리얼 엔진의 자동 메모리 관리
- 잘못된 포인터 사용 예시
- Java, C#은 이런 문제를 해결하기 위해 가비지 컬렉션 시스템을 도입함.
가비지 컬렉션 시스템
- 동적으로 생성된 모든 오브젝트 정보를 모아둔 저장소를 사용해 사용되지 않는 메모리를 추적
- 마크-스윕(Mark-Sweep) 방식의 가비지 컬렉션
- 저장소에서 최초 검색을 시작하는 루트 오브젝트를 표기.
- 루트 오브젝트가 참조하는 객체를 찾아 마크(Mark).
- 마크된 객체로부터 다시 참조하는 객체를 찾아 마크, 이를 계속 반복.
- 가비지 컬렉터가 저장소에서 마크되지 않은 객체(가비지)들의 메모리를 회수.(Sweep)
언리얼 엔진의 가비지 컬렉션 시스템
- 관리되는 모든 언리얼 오브젝트의 정보를 저장하는 전역 변수: GUObjectArray
- GUObjectArray의 각 요소에는 플래그(Flag)가 설정되어 있음.
- Garbage 플래그: 다른 언리얼 오브젝트로부터의 참조가 없어 회수 예정인 오브젝트
- RootSet 플래그: 참조가 없어도 회수하지 않는 특별한 오브젝트
- 가비지 컬렉터는 GUObjectArray에 있는 플래그를 확인해 빠르게 회수해야 할 오브젝트를 파악하고 메모리에서 제거함
- 주기적으로 메모리를 회수한다.(기본 값 60초)
오브젝트 선언의 기본 원칙
- 오브젝트 포인터는 가급적 UPROPERTY()로 선언하고, 메모리는 가비지컬렉터가 자동으로 관리하도록 위임한다.
- 생성된 언리얼 오브젝트를 유지하기 위해 레퍼런스 참조 방법을 설계할 것
- 언리얼 오브젝트 내의 언리얼 오브젝트: UPROPERTY() 사용
- 일반 C++ 오브젝트 내의 언리얼 오브젝트: FGCObject의 상속 후 구현
- 생성된 언리얼 오브젝트는 강제로 지우려 하지 말 것.(가비지컬렉터에 위임)