게임 개발/Unreal Engine 기본

TObjectPtr를 사용하는 이유

지노윈 2025. 12. 30. 11:04
반응형

언리얼 엔진 5(UE5)에서 도입된 TObjectPtr은 기존의 Raw Pointer(C++ 기본 포인터, 예: UObject*)를 대체하기 위해 설계된 엔진 전용 스마트 포인터 시스템입니다.

단순히 주소를 가리키는 것을 넘어, 에디터 환경과 메모리 관리 효율을 위해 도입되었습니다. 주요 사용 이유 4가지는 다음과 같습니다.

 

1. 지연 로딩 (Lazy Loading) 및 성능 최적화

가장 큰 기술적 이유는 에디터 빌드에서 오브젝트를 실제로 필요할 때까지 로드하지 않기 위해서입니다.

  • Raw Pointer: 포인터 변수가 선언되어 있으면 해당 오브젝트를 즉시 메모리에 올려야 할 때가 많습니다.
  • TObjectPtr: 에디터 환경에서 해당 객체가 실제로 접근(Access)되기 전까지는 로딩을 지연시키거나, 경로 정보만 가지고 있을 수 있습니다. 이는 특히 대규모 프로젝트에서 에디터 로딩 속도를 획기적으로 줄여줍니다.

2. 엔진 시스템과의 긴밀한 통합 (Access Tracking)

TObjectPtr은 단순한 주소값이 아니라 객체 접근을 추적할 수 있는 래퍼(Wrapper)입니다.

  • 디버깅 및 통계: 어떤 오브젝트가 얼마나 자주 참조되는지, 언제 로드되는지 엔진이 모니터링하기 쉬워집니다.
  • 가비지 컬렉션(GC): 엔진의 가비지 컬렉터가 객체를 더 효율적으로 식별하고 관리할 수 있도록 돕습니다.

3. 에디터에서의 안전성 및 유연성

에디터에서 블루프린트나 에셋을 수정할 때, TObjectPtr은 Optional하게 동작할 수 있는 구조를 제공합니다. 에셋의 주소가 바뀌거나 재로드되는 상황에서도 Raw Pointer보다 훨씬 유연하게 대응합니다.

4. 최신 표준 및 가시성 (Modernization)

UE5부터 엔진 소스 코드 전반에 적용되었으며, 프로그래머에게 이 변수가 "언리얼 오브젝트(UObject)를 가리키고 있으며, 엔진에 의해 관리되고 있음"을 명확히 알려줍니다.


핵심 차이점 요약

특징 Raw Pointer (UObject*) TObjectPtr<T>
권장 버전 UE4 이하 UE5 이상 필수 권장
로딩 방식 즉시 로딩 위주 에디터에서 지연 로딩 지원
안전성 수동 관리 요소 많음 엔진 시스템(GC, 에디터) 최적화
런타임 오버헤드 없음 거의 없음 (릴리즈 빌드에선 Raw Pointer로 컴파일됨)

[IMPORTANT]

실제 게임 배포(Shipping) 빌드에서는 TObjectPtr이 내부적으로 Raw Pointer와 동일하게 컴파일되도록 설계되어 있습니다. 따라서 런타임 성능 저하 없이 개발 단계의 이점만 챙길 수 있습니다.

사용 예시 (C++)

UPROPERTY(EditAnywhere, Category = "MyCategory")
TObjectPtr<UStaticMeshComponent> MeshComponent;

UPROPERTY(EditAnywhere, Category = "MyCategory")
TObjectPtr<UTexture2D> BackgroundTexture;

 

반응형