언리얼 엔진의 메모리 관리

myeongrangcoding·2023년 12월 2일

언리얼 엔진의 자동 메모리 관리

  • 잘못된 포인터 사용 예시
    • Leak, Dangling, Wild
  • Java, C#은 이런 문제를 해결하기 위해 가비지 컬렉션 시스템을 도입함.

가비지 컬렉션 시스템

  • 동적으로 생성된 모든 오브젝트 정보를 모아둔 저장소를 사용해 사용되지 않는 메모리를 추적
  • 마크-스윕(Mark-Sweep) 방식의 가비지 컬렉션
    • 저장소에서 최초 검색을 시작하는 루트 오브젝트를 표기.
    • 루트 오브젝트가 참조하는 객체를 찾아 마크(Mark).
    • 마크된 객체로부터 다시 참조하는 객체를 찾아 마크, 이를 계속 반복.
    • 가비지 컬렉터가 저장소에서 마크되지 않은 객체(가비지)들의 메모리를 회수.(Sweep)

언리얼 엔진의 가비지 컬렉션 시스템

  • 관리되는 모든 언리얼 오브젝트의 정보를 저장하는 전역 변수: GUObjectArray
  • GUObjectArray의 각 요소에는 플래그(Flag)가 설정되어 있음.
    • Garbage 플래그: 다른 언리얼 오브젝트로부터의 참조가 없어 회수 예정인 오브젝트
    • RootSet 플래그: 참조가 없어도 회수하지 않는 특별한 오브젝트
  • 가비지 컬렉터는 GUObjectArray에 있는 플래그를 확인해 빠르게 회수해야 할 오브젝트를 파악하고 메모리에서 제거함
  • 주기적으로 메모리를 회수한다.(기본 값 60초)

오브젝트 선언의 기본 원칙

  • 오브젝트 포인터는 가급적 UPROPERTY()로 선언하고, 메모리는 가비지컬렉터가 자동으로 관리하도록 위임한다.
  • 생성된 언리얼 오브젝트를 유지하기 위해 레퍼런스 참조 방법을 설계할 것
    • 언리얼 오브젝트 내의 언리얼 오브젝트: UPROPERTY() 사용
    • 일반 C++ 오브젝트 내의 언리얼 오브젝트: FGCObject의 상속 후 구현
  • 생성된 언리얼 오브젝트는 강제로 지우려 하지 말 것.(가비지컬렉터에 위임)
profile
명랑코딩!

0개의 댓글