UE5

TObjectPtr 은 뭐고 왜 쓸까?

게임 개발 2024. 9. 14. 14:04

 

TObjectPtr 이란?

 

TObjectPtr은 원시 포인터를 대체하기 위한 UObject용 포인터입니다.

언리얼에서는 공식적으로

C++ 라이선스 사용자의 프로젝트에 원시 오브젝트 포인터를 사용하거나,

TObjectPtr을 선택적으로 사용할 수 있도록 합니다.

 

UE5에서는

템플릿 기반 64비트 포인터 시스템인 TObjectPtr를 도입하여 에디터 빌드를 지원합니다.

 

TObjectPtr의 기능

 

1. 에디터 빌드에 다이나믹 해상도와 액세스 트래킹을 추가하면서

( = 에디터 빌드에서 수행하는 기능이 있으며,)

비에디터 빌드의 원시 포인터와 동일한 역할을 수행합니다.

( = 비에디터 빌드에서 장애가 되지 아니함)

 

2. TObjectPtr 변수는 함수로 전달되가나 로컬 변수에 저장될 때

자동으로 원시 포인터로 변환됩니다.

(기능적 하자가 없음)

 

3. UPROPERTY 변수에 원시 포인터가 있엇던

만른 엔진 클래스에서 이제 TObjectPtr을 사용합니다.

이는 대부분 묵시적으로 TObjectPtr 은 원시 포인터로 변환되지만,

엔진 클래스 멤버 변수와의 적접적인 상호작용에서

원시 포인터 시맨틱을 TObjectPtr 시맨틱으로 변환해야하는 경우가 드물게 있기 때문입니다.

 

 

그럼 왜 TObjectPtr 를 사용해야 하는가?

 

선택 사항이긴 하지만 언리얼은 공식적으로

TObjectPtr 포인터 프로퍼티에 대한 T*와 UCLASS 및 USTRUCT 타입에 있는

컨테이너 클래스를 통해 TObjectPtr<T>를 사용하는 것을 권장합니다.

 

TObjectPtr 은 비에디터 빌드에 대한 원시 포인터로 변환되므로

동작 및 성능에 영향을 미치지 않기 때문입니다.

(반대로 생각하면 특정 원시포인터는 TObjectPtr 로 변환되지 않으므로 

동작 및 성능에 영향을 미침)

 

 

언리얼에서 제안하는 포인터 사용방식

 

1. 컨테이너 함수 'Find' 패밀리를 호출할 때 T** 대신

TObjectPtr<T>* 를 사용하여 반환값을 캡처합니다.

 

2. 원시 포인터 컨테이너를 통한 범위 기반 반복작업에서 auto*를

이터레이터 변수 타입으로 사용했을 수 있습니다.

따라서 이를 auto&로 바꿔줍니다.

또한 새 코드에 auto& 또는 const auto&를 사용하는 것을 권장합니다.

TObjectPtr가 해결된 오브젝트 주소를 캐시한 이후에 액세스 시도에 소요되는 시간을 절약할 수 있기 때문입니다.

 

3. 원시 포인터가 필요하고 묵시적 변환을 사용할 수 없는 TObjectPtr에서

ToRawPtr또는 Get을 호출합니다.

일반적인 사례로는 const_cast 내부의 3항 연산 및 사용이 있습니다.

함수 델리게이트로 파라미터를 전달할 때 평행 델리게이트 함수를 패스스루로 선언하고,

원시 포인터를 TObjectPtr 파라미터로 대체합니다.

다음 예시에서는 패스스루 델리게이트 함수를 보여줍니다.

 

      // 대부분의 사례에서 사용할 원시 포인터를 사용하는 원본 함수 시그니처:
      static bool MyFunction(UObject* FirstParameter);
 
      // 드물게 묵시적 변환을 사용할 수 없을 때 이 패스스루 함수를 사용합니다.
      // TObjectPtr를 사용하는 패스스루 함수 시그니처:
      static bool MyFunction(TObjectPtr<UObject> FirstParameter);
 
      // (소스 파일의) 패스스루 함수 바디:
      bool UMyClass::MyFunction(TObjectPtr<UObject> FirstParameter)
      {
          return ShouldShowResetToDefault(FirstParameter.Get());
      }

 

 

 

참고 문서 UE5 공식문서

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-5-migration-guide?application_version=5.0