UE5

가비지 컬렉션

게임 개발 2024. 1. 26. 11:40
가비지 컬렉션이란?

 

가비지 컬렉션은 메모리 관리 기법 중 하나로

프로그래밍을 하다 보면 동적으로 할당해준 메모리에 대한 지속된 관리가 필요합니다.

컴퓨터는 일정한 메모리 용량을 가지고 있고, 정해진 메모리를 초과하게 되면

동작하는 프로그램이 정상적으로 작동하지 않을 수 있습니다.

때문에 가비지 컬렉터를 통해서 프로그램이 동적으로 할당했던 메모리 영역 중에서

더 이상 쓰이지 않고 필요 없는 영역을 해제하는 것을 말합니다.

 

C++에서는 수동 메모리 관리를 가정하고 설계하였으나,

언리얼에서는 가비지 컬렉션을 통해서 프로그래머가 관리해야 할 메모리 영역이 줄어듭니다.

 

가비지 컬렉션의 장단점


장점의 첫 번째로는

유효하지 않은 포인터의 접근을 막을 수 있습니다.

유효하지 않은 포인터의 접근을 막지 않으면 

만약 이 포인터가 해제되고 새로운 값이 할당되었다면, 잘못된 값을 읽어오게 됩니다.

이와 같은 이미 해제된 메모리에 접근하는 버그를 방지할 수 있습니다.

 

두 번째로는

이중 해제를 막을 수 있습니다.

일부 메모리 할당 알고리즘에서는,

해제된 메모리를 다시 해제하려고 시도하는 것은 오류를 일으킬 수 있습니다.

가비지 컬렉션을 이용하면

이미 해제된 메모리를 또 다시 해제하여 발생하는 버그를 방지할 수 있습니다.

 

마지막으로

메모리 누수를 방지할 수 있습니다.

더 이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그를 방지하게 되면

메모리 누수의 반복으로 인해 메모리가 고갈되어 프로그램이 중단될 수 있습니다.

 

 

단점의 첫 번째로는

어떤 메모리를 해제할지 결정하는데 비용이 들게됩니다.

객체가 필요 없어지는 시점을 프로그래머가 미리 알고 있는 경우에도

가비지 컬렉터가 추척을 하긴 해야 하므로, 오버헤드가 됩니다.

 

두 번째로는

가비지 컬렉터가 작동되는 타아밍이나 점유 시간을 미리 예측하기 어렵다는 것입니다.

때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다는 위험이 생겨

안정성 문제가 있습니다.

 

세 번째는

할당된 메모리가 해제되는 시점을 알 수 없다는 것입니다.

자원 할당과 변수 초기화가 일치하는 RAII 스타일의 프로그래밍에서는

자원 해제 시점을 알 수 없는 것을 의미합니다.

 

 

 

언리얼 엔진에서의 가비지 컬렉션

 

이런 메모리 관리 기법으로는 자바, C# 등 일부의 언어에서는

해당 기능을 염두하고 설계되었지만,

C++ 기반은 수동 메모리 관리를 기반으로 설계되었습니다.

하지만 언리얼이 제공하는 C++에서는 해당 기능을 자체적으로 지원하고있습니다.

 

언리얼에서는 더 이상 참조되지 않거나, 

명시적으로 소멸 예약시킨 UObject를 주기적으로 정기하는 가비지 컬렉션 스키마를 사용합니다.

엔진에서 레퍼런스 그래프를 만들어 오브젝트가 사용 중인지, 소멸 대기 중인지를 알아냅니다.

이 그래프 루트에서는 루트 세트라 지정된 오브젝트 셑가 있습니다.

어떤 오브젝트도 루트 세트에 추가시킬 수 있습니다.

 

 

가비지 켈렉션이 발생하면,

엔진은 루트부터 시작해서 알려준 UObject 레퍼런스 트리를 검색하여

참조된 오브젝트를 전부 추적하고,

 

참조되지 않은 오브젝트 즉,

트리 검색에서 찾지 못한 것들을 필요하지 않다고 판단하고 제거합니다.

 

루트세트에서 참조되지 않는 가비지컬렉터에 수집된 2개의 UObject

 

이러한 빙식은 Mark & Sweep(마크 앤 스윕) 방식이라고 불리며,

루트 세트로부터 Mark되고, Mark 되지 않은 오브젝트 들을 Sweep 된다고 말할 수 있습니다.

 

 

언리얼엔진에서의 가비지컬렉션 관련 설정은

언리얼 오브젝트가 GC 시스템에 의해 자동 관리되기 위해서 선언에 UPROPERTY 매크로를 해줘야 합니다.

GC 시스템이 언리얼 오브젝트를 관리하는 방식은

기본적으로는 Mark and Sweep 방식과 비슷하게 GC가 동작하게 됩니다.

Reference Count 방식으로는 상호 참조 문제가 해결되지 않는 

스마트 포인터에서 공유 포인터와 유사합니다.

 

출저 

위키피디아

언리얼 공식문서 참조

및 개인 블로그 참조

https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/

https://hyo-ue4study.tistory.com/272

'UE5' 카테고리의 다른 글

작업 - 0303  (0) 2024.03.04
개발일지  (0) 2024.02.29
Survival 구조 정리 - 플레이어 손에 아이템 장착 시키기  (0) 2024.01.19
레이캐스트와 트레이스  (2) 2024.01.11
Survival - 0102 - 작업 메모  (0) 2024.01.02