Unreal Engine

3. Garbage Collector

CE : 하랑 2026. 1. 4. 19:09

(1) 언리얼 엔진에서는 물론 스마트 포인터를 지원하지만, 동시에 가비지 컬렉터도 지원한다.

(2) 언리얼에서 UPROPERTY 리플렉션을 붙인 객체는 언리얼 엔진이 자동으로 가비지 컬렉터를 이용하여 메모리를 관리합니다.

 

(3) 가비지 컬렉션을 수행함에 있어 리플렉션 시스템을 사용하는데, 엔진이 객체와 속성값을 알고 있으므로, 더 이상 사용되지 않아 삭제해도 괜찮은 객체들을 구분할 수 있기 떄문입니다.

(4) UObject는 언리얼에서 제공하는 NewObject, SpawnActor, CreateDefaultSubobject와 같은 함수를 통해서만 생성이 가능하다. (c++의 new를 이용해서는 안된다.)

 

(5) 가비지 컬렉션이 실행되면 엔진은 "Root Set" 을 시작으로  UObject 레퍼런스 트리를 검색해 참조된 오브젝트를 모두 추적한다. 이 검색 과정에서 찾지 못한 것들은 더 이상 필요하지 않는 오브젝트라고 판단하고 제거할 수 있는 것 입니다.

이는 가비지 컬렉션이 리플렉션 데이터에 의존하므로 가능한 일 입니다.

 

(6) 관리대상으로 지정된 객체들은 UObject의 모든 하위 클래스들이다.

 

(7) 

언리얼 엔진에서는 Reference Graph를 만들어 오브젝트들의 사용 여부를 구분합니다. 이 그래프 루트에는 "Root Set" 이라 지정된 오브젝트 셋이 존재하며 "Root Set" 에 포함된 객체들은 가비지 컬렉션 대상에서 제외됩니다.

UObject::BaseUtility::AddToRoot 함수를 이용하면 객체를 "Root Set" 에 추가시킬 수 있다.

 

(8) 

캐쉬 적중률은 기본적으로 관련성 있는 메모리들은 붙어있어야 속력에 이득을 볼수가 있다는 것이다.

 

언리얼은 이 cdo를 하면서 전체 클래스에 필요한 크기를 알아냅니다.

 

 

- 가비지 컬렉션을 사용할려면 몇가지 규칙 

 

(1) UPROPERTY()  

- UObject 내에서 UPROPERTY로 멤버 변수를 사용했다면, 해당 오브젝트에 대한 Strong Reference를 가지게 된다. 따라서 해당 오브젝트가 살아있는 동안에는 멤버 변수가 따로 가비지 콜렉팅 대상이 되는 일은 없다.

 

UPROPERTY 로 참조된 언리얼 오브젝트 는 회수 당하지 않는다 (대부분의 케이스) 

- > 언리얼 오브젝트인데 UPROPERTY 를 붙이지 않은 참조의 경우, Dangling 문제가 발생 한다.

- 빌드 시에 UHT(Unreal Header Tool)이 이 매크로를 감지하고 리플렉션 유형에 추가하게 됩니다. 이렇게 언리얼 리플렉션 시스템에 추가된 UPROPERTY는 가비지 콜렉션(Gargbage Collection)에 의해 생명 주기가 관리되며, 리플렉션을 통해 이 멤버 변수의 이름, 유형 등을 런타임 중에 확인할 수 있게 됩니다.

 

-> 반대로 말하자면, UPROPERTY() 매크로가 기술되지 않은 멤버 변수( 프로퍼티 )는 언리얼 리플렉션에 노출되지 않으며, 리플렉션 시스템이 제공하는 GC, 런타임 정보 확인 등을 사용할 수 없다는 이야기가 되는 셈입니다.

 


- 프로퍼티 지정자

(1)  BlueprintReadWrite

-> 프로퍼티는 블루프린트에서 읽거나 쓸 수 있습니다.

-> 블루프린트 에디터 내 내 블루프린트 패널 또는 우클릭 액션 목록에서 'Get/Set 변수명'을 이벤트 그래프 또는 함수 창에서 사용할 수 있음을 의미

 

(2) BlueprintReadOnly

-> 프로퍼티는 블루프린트에서 읽을 수는 있지만 변경은 안됩니다.

-> 블루프린트 에디터 내 내 블루프린트 패널 또는 우클릭 액션 목록에서 'Get 변수명'을 이벤트 그래프 또는 함수 창에서 사용할 수 있음을 의미

 

(3) EditAnywhere

-> 아키타입이나 인스턴스 양쪽의 프로퍼티 창에서 편집 O

-> 레벨에 배치된 클래스를 클릭했을 때 나오는 디테일 창 및 블루프린트 에디터의 디테일 창에서 해당 변수가 노출되며, 편집가능한 상태가 됩니다.

 

(4) VisibleAnywhere

-> 모든 프로퍼티 창에서 보이지만 편집할 수 없음을 나타냅니다. 

-> 레벨에 배치된 클래스를 클릭했을 때 나오는 디테일 창 및 블루프린트 에디터의 디테일 창에서 해당 변수가 노출되지만, InputField가 회색으로 블록되어 편집할 수 없습니다.

 

(5) AllowPrivateAccess =true

-> C++ 코드상에서 private 접근 한정자로 수식된 변수에 대해 접근을 허용하여, 블루프린트 상에 노출시킬 수 있도록 돕습니다.

 


(2) UClass()

- UCLASS(내용) -> 내 클래스를 좀 특별하게 처리해 달라.

 

-> 이걸 안넣으면 언리얼 에디터상에서는 사용할수 없다.

- 클래스를 Unreal의 리플렉션 시스템에 등록한다. 언리얼 오브젝트로써 등록을 한다는 것이다.
이걸 안달면 그냥 언리얼이 알지 못함

 

- 언리얼 오브젝트에 특별한 기능을 추가하는 구문을 지정자라고 한다. 필요한 경우 UCLASS 뒤 괄호 ()에 특수한 기능을 하는 지정자를 삽입할 수 있으며, 

 

- 지정자

Abstract : 해당 클래스를 추상 클래스로 만들어 액터로 레벨에 배치할 수 없게 한다.

Blueprintable : 블루프린트 클래스로의 확장을 가능하게 한다.

BlueprintType : 블루프린트에서 변수로 사용할 수 있는 타입으로 노출시킨다.

 

 

(3) UStruct

- 구조체는 Value 타입으로 사용하기 위한 것이다.

- 구조체는 가비지 컬렉션의 대상이 아니므로, UObject내에 위치해야 메모리가 올바르게 회수될 수 있다.

- UStruct의 장점은 크기가 매우 작다는 것인데,

-> UObject는 데이터 외에도 book-keeping 데이터를 거쳐야 하지만, UStruct는 사용자가 입력한 크기 만큼만 사용하기 떄문이다

- UStruct는 다른 객체의 맴버 구조체를 직접 가리키는 것이 안전하지 않다는 단점 또한 존재한다.

 

 (4) UObject

- UObject는 UStruct에 비해 무겁지만 안전하게 사용할수 있다.

 

 

(5) UFUNCTION()

- UFUNCTION은 언리얼에서의 함수의 사용방법을 정의내리는 언리얼 문법이라고 볼수 있다.

 

- 그래서 UFUNCTION을 붙이면 언리얼 특별히 관리하는 함수가 된다고 보시면 되고

 

- UFUNCTION(내용)

 

내용에 따라서 언리얼 에디터에서의 사용방법에 차별점을 둘수가 있습니다.

 

 

- 멀티 플레이 -> Server, NetMulticast, Client 기능 사용

 

UFUNCTION의 가장 기본적인기능은

내가 만든 c++ 함수를 언리얼에서

알게하는 것입니다.

 

UFUNCTION(내용) 이 함수를

 

내용의 옵션으로 사용하고싶어

BlueprintCallable :  CPP 코드로 만든 함수를 블루프린트 또는 레벨블루프린트에서 호출할 수 있도록 하는 매크로이다.

BlueprintImplementableEvent : 이 매크로를 사용한 함수는 CPP에서 정의할 수 없으며 블루프린트에서 함수 내부를 정의해야한다.

BlueprintPure : 간단하게 값을 넣고 반환하는 형태의 키워드입니다

'Unreal Engine' 카테고리의 다른 글

5. Level, Actor  (0) 2026.01.18
4. RPC 서버  (1) 2026.01.18
2. 서브시스템  (0) 2026.01.03
1. RTTI vs Reflection  (0) 2025.12.30
24. 언리얼 Enhanced Input  (0) 2024.08.17