[Unreal] Reflection, GC

민혁 공부방·2024년 11월 10일

이전시간에는 언리얼엔진을 통한 C++ 연동작업에 대해서만 긴급하게 설명하였다.
언리얼엔진에서 리플렉션과, 가비지콜렉터가 무슨 역할을 하는지 알아보도록 할것이다.

< Reflection >

우선, Unreal에서는 C++ 클래스, 구조체, 함수, 멤버 변수 및 열거형에 대한 정보를 수집하거나 조작하는 자체 시스템이 존재한다.


너무 주입적으로 외웠던 부분이다.
UCLASS와, GENERATED_BODY()가 같이들어가야한다,
#include "U02_Mesh.generated.h" 해당 헤더파일이 들어가야한다. 등등

  1. #include "U02_Mesh.generated.h"에는 U02_Mesh라는 파일을 Unreal Header Tool에 알린다.

  1. AU02_Mesh는 U02_Mesh가 Actor을 상속하기때문이며, 이 C++로 작성된 파일은
    클래스로 선언되었으며, 이를 CLASS형태로 리플렉션하기 위함으로 UCLASS()가 위에 선언된다.

  2. 사실상 GENERATED_BODY()같은 경우는 CLASS형태로 파일을 생성하게되면 자동으로 생성되는 마커이다.


이 자체가, Reflection으로서
1. 프로퍼티
2. 함수
3. 클래스
4. 열거형
5. 인터페이스
등등 많은 역할을 가지고 간다는 뜻.


이 부분이 무슨뜻일까?
UStaticMeshComponent클래스(주소를 받음)를 Mesh라고 선언할 것이다.
근데 이게 UPROPERTY의 옵션 VisibleAnywhere(읽기전용 - readonly)와 같이,
Mesh에 대해서는 우리가 작성한 C++코드에대해서, 수정하지 못하게 작업할 것임을 알린다.

다시 말씀드리자면,
이러한 세부적인 하나하나 모든 내용들이 Unreal Header Tool에 들어가며, 이를 알려서 조력해주는 역할이 Reflection 이라는 뜻.

< GC >

가비지 컬렉션은 더 이상 필요하지 않은 객체를 가비지 컬렉터가 메모리에서 할당 해제해주는 방법이다.
프로그램의 규모가 커질수록 이것들을 일일이 신경쓰기가 어렵기 때문에 등장한 개념이다.

예를 들어 RPG 게임에서 다른 플레이어가 접속을 종료해 해당 메모리를 해제하는 상황이라고 가정해보자. 이 플레이어와 관련된 아이템, 인벤토리 등등이 모두 해제되고 파괴될 것이다. 만약 이 작업들을 컴퓨터(또는 게임)가 바쁠 때 수행한다면 게임이 잠시 멈출 수도 있을 것이다. 따라서 원활한 게임 진행을 위해서 이러한 해제 작업을 가비지 컬렉터에게 알리고, 가비지 컬렉터는 비교적 여유로울 때 메모리 해제 작업을 차근차근 처리하는 것이다.
정리하자면, 프로그래머가 메모리 관리에 대해 수동적으로 처리해줘야하는 부담을 덜어준다고 보면 될 것이다. 
출처: https://upbo.tistory.com/79 [메모장:티스토리]

  • C++ 객체와 UObject 객체의 차이
    C++ 객체 : new나 malloc 등을 사용하여 생성된 객체는 수동으로 메모리를 관리해야 합니다. 즉, 객체를 생성한 후에는 명시적으로 메모리 해제를 해야 합니다.
    UObject 객체 : UObject 계열 객체는 가비지 컬렉터가 관리하므로, 메모리 해제가 자동으로 이루어집니다. UObject는 가비지 컬렉터가 추적하여, 더 이상 사용되지 않는 객체를 메모리에서 자동으로 해제합니다.

즉, UStaticMeshComponent가 UObject로 동작하기때문에 주소값을 통해 자동으로 GC를 하기 위함이라고 볼 수 있다.

profile
한번 더 복습하기 위한 개인 공간입니다!

0개의 댓글