[UE5] TObjectPtr vs 일반 포인터: 가비지 컬렉션과 지연 로드로 메모리 최적화하기

ChangJin·2024년 11월 20일
0

Unreal Engine5

목록 보기
112/114
post-thumbnail

TObjectPtr과 일반적인 포인터(*)의 차이점은 Unreal Engine의 메모리 관리, 특히 가비지 컬렉션과 관련이 있으며, TObjectPtr옵션으로 지연 로드(lazy load)를 지원하는 방식입니다.


1. TObjectPtr vs 일반 포인터(*)의 차이점

1.1 일반 포인터 (*)

  • 설명: C++의 기본 포인터 타입으로, 객체의 메모리 주소를 직접 저장합니다.
  • 장점: 접근 속도가 빠르며, C++ 전반에서 사용됩니다.
  • 단점: Unreal Engine의 가비지 컬렉션 시스템과는 연동되지 않으므로, 수동으로 메모리 관리가 필요합니다. 또한, 잘못된 포인터 접근으로 인해 메모리 오류가 발생할 가능성이 있습니다.
  • 사용 예: 객체를 수동으로 관리할 필요가 있거나, 가비지 컬렉션 시스템을 사용할 수 없는 경우.

1.2 TObjectPtr

  • 설명: Unreal Engine 5에서 도입된 스마트 포인터로, Unreal Engine의 가비지 컬렉션과 밀접하게 통합되어 있습니다.
  • 장점: 객체의 유효성을 자동으로 추적하여 잘못된 접근을 방지합니다. 또한, Unreal Engine의 GC(Garbage Collection) 시스템에서 안전하게 관리할 수 있습니다.
  • 단점: 일반 포인터보다 접근 속도가 약간 느릴 수 있습니다.
  • 사용 예: 엔진이 메모리 관리를 자동으로 하도록 하며, 지연 로드와 같은 최적화가 필요할 때 사용합니다.

2. Optional Lazy Load Behavior (지연 로드 동작)

TObjectPtr지연 로드(Lazy Load) 기능을 옵션으로 지원하여, 객체에 실제로 접근할 때만 로드할 수 있습니다. 이를 통해 메모리와 성능을 최적화할 수 있으며, 특히 대규모 데이터셋이 있을 때 유용합니다.

Lazy Load의 동작 방식

  • 정의: 객체를 즉시 메모리에 로드하지 않고, 실제 접근 시점에 로드하는 방식입니다.
  • 장점: 메모리 사용을 줄이고, 필요한 객체에 대해서만 메모리를 할당할 수 있어 성능을 개선합니다.
  • 예제: 큰 리소스 파일을 사용할 때 TObjectPtr을 사용해 지연 로드 설정을 활성화하면, 리소스 전체를 로드하지 않고 필요한 시점에만 데이터를 로드합니다.

예제 코드

다음은 TObjectPtr을 사용하여 지연 로드할 객체를 선언하고 사용하는 예제입니다.

// UObject 타입 객체의 지연 로드 설정
TObjectPtr<UTexture2D> LazyTexture;

void MyFunction()
{
    if (LazyTexture)  // 실제 접근 시점에만 로드
    {
        // LazyTexture가 실제로 로드되어 접근 가능해진 상태입니다.
    }
}

이 예제에서는 LazyTexture에 접근할 때만 객체가 메모리에 로드됩니다. 접근하지 않으면 메모리가 낭비되지 않으며, 성능이 필요한 시점에만 메모리 로드가 이루어집니다.


요약

  • TObjectPtr은 Unreal Engine의 가비지 컬렉션 시스템과 연동되어 메모리를 안전하게 관리하고, 지연 로드를 통해 최적화를 지원합니다.
  • 일반 포인터(*)는 직접 메모리 관리를 해야 하며, 잘못된 메모리 접근을 방지하지 못합니다.
  • 지연 로드는 객체가 실제로 필요할 때 로드하는 방식으로, 메모리 최적화에 유리합니다.
profile
게임 프로그래머

0개의 댓글