언리얼 엔진 5

언리얼엔진5 C++로 정복하기(8) 객체들에게 왜 대부분 포인터가 붙을까?

Voitcon 2024. 2. 20. 18:20

언리얼엔진5 에서 c++로 코딩하다보면 헤더파일부분에서 객체를 선언할때 대부분 포인터가 붙는걸 알 수 있는데 왜 그럴까..?

언리얼 객체 관리 시스템과 관련이 있는데, UGameplayStatics나 USoundBase, UCameraComponent 와 같은 것들은 언리얼 엔진의 엑터나 엑터 컴포넌트와 같은 게임 오브젝트들로 이들은 동적으로 생성되고 관리된다..

게임 오브젝트들은 실행 시간동안 생성되고 파괴될 수 있는데, 포인터를 사용하여 이러한 객체에 대한 참조를 유연하게 할당하고 해제할 수 가 있다.

그리고 성능 최적화 부분에서 객체는 크기가 크고 복잡한데 객체 자체를 값으로 전달하는 것보다 포인터를 전달하는것이 훨씬더 효율적인데, 포인터를 사용하면 객체의 실제 데이터를 복사할 필요 없이 객체에 접근할 수 있어 메모리 사용량과 함수 호출 비용을 줄일 수 있다.

그리고 이제 유니티나 자바는 가비지 콜렉션이 있어 메모리를 자동으로 관리하여 유니티의 경우 gc 스파이크로 최적화 문제가 있고 c++의 경우는 포인터를 사용하여서 수동으로 메모리를 해제하여 메모리 관리에 효율적이다 하는데, 사실 언리얼을 처음 만져보면 메모리를 수동으로 해제를 한 적이 없다..

 

언리얼엔진에도 가비지 컬렉션이 있다고 하더군요..

가비지 컬렉션의 작동 원리로는 모든 객체에 대한 참조를 추적하고, 루트 세트라고 불리는 객체 집합에서 시작하여 이 객체들로부터 도달할 수 있는 모든 객체를 찾아내어 루트세트에 속한 객체는 가비지 컬렉션의 대상이 되지 않는다.

루트 세트로 부터 도달할 수 없는 객체는 더 이상 게임이나 애플리케이션에 사용되지 않는 것으로 간주되어 메모리에서 해제가 된다.

그리고 UPROPERTY 매크로를 사용하면 해당 변수는 리플렉션 시스템에 의해 자동으로 관리되며, 가비지 컬렉션 시스템에 의한 관리 대상이 될 수 있다!! <UOBJECT> 타입의 포인터 변수만..

 

마지막으로 TARRAY도 동적 배열인데 가비지 컬렉션으로 메모리를 해제 하나요?

아니다. 물론 TARRAY가 UOBJECT 파생 클래스의 객체를 저장한다면 가비지 컬렉션에 관리된다.

하지만 INT 나 float 와 같은 자료형은 내부적으로 메모리 할당과 해제를 자동으로 처리한다.