게임개발/Unreal C++

[Unreal]#스마트 포인터

Hardii2 2024. 7. 30. 15:25

#1. TUniquePtr

 

1. 개념

TUniquePtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로 단일 소유권을 가진 스마트 포인터입니다. 

 

2. 특징

  1. 단일 소유권
  2. 복사 불가, 이동 허용
  3. 낮은 메모리 오버헤드

 

3. 코드

TUniquePtr<FMyClass> UniquePtr = MakeUnique<FMyClass>();
UniquePtr->DoSomething();

// 소유권 이전
TUniquePtr<FMyClass> NewPtr = MoveTemp(UniquePtr);
// 이제 UniquePtr은 nullptr이 되고, NewPtr이 객체를 소유합니다.

 


 

#2. TSharedPtr

 

1. 개념

TSharedPtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로, 공유 소유권을 가진 포인터입니다. C++의 shared_ptr와 같이 레퍼런스 카운팅을 통해 객체 수명을 관리합니다. 여러 TSharedPtr 유형의 포인터 변수는 하나의 객체를 동시에 참조할 수 있습니다.

 

2. 특징

  1. 공동 소유권
  2. 레퍼런스 카운팅을 통한 객체 수명 관리
  3. 순환 참조 문제

 

4. 코드

TSharedPtr<FMyClass> SharedPtr1 = MakeShared<FMyClass>();
TSharedPtr<FMyClass> SharedPtr2 = SharedPtr1;

if (SharedPtr1.IsValid())
{
    SharedPtr1->DoSomething();
}
// SharedPtr1과 SharedPtr2가 모두 소멸되면 객체가 삭제됩니다.

 


 

#3. TWeakPtr

 

1. 개념

TWeakPtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로, TSharedPtr의 약한 참조 버전입니다. TWeakPtr는 공동 소유권을 통해 발생하는 순환 참조 문제를 방지하며, 가비지 컬렉션 작업 시 가리키던 객체가 소멸되면 null로 설정됩니다.

 

2. 특징

  1. TSharedPtr의 약한 참조 버전
  2. 객체 수명에 영향 X
  3. 순환 참조 문제 해결
  4. IsValid() 활용 객체 존재 여부 확인

 

3. 코드

TSharedPtr<FMyClass> SharedPtr = MakeShared<FMyClass>();
TWeakPtr<FMyClass> WeakPtr = SharedPtr;

if (TSharedPtr<FMyClass> LockedPtr = WeakPtr.Pin())
{
    LockedPtr->DoSomething();
}
// SharedPtr이 소멸되면 WeakPtr은 자동으로 무효화됩니다.

 


 

#4. TObjectPtr

 

1. 개념

TObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로 UObject 파생 클래를 위홰 최적화된 스마트 포인터입니다. TObjectPtr는 자동 참조 및 역참조 연산을 지원하며, UObject에 대하여 내부적으로 최적화되어 있어 성능상 이점이 있습니다.

 

2. 특징

  1. 자동 참조 및 역참조
  2. 내부 최적화 및 성능상 이점
  3. UObject 및 파생 클래에만 사용 가능
  4. Game과 Editor의 직렬화 제공
  5. 가비지 컬렉션 지원

 

3. 코드

UPROPERTY()
TObjectPtr<UMyObject> ObjectPtr;

void UseObject()
{
    if (ObjectPtr)
    {
        ObjectPtr->DoSomething();
    }
}
// 가비지 컬렉션 중에 ObjectPtr은 자동으로 null로 설정될 수 있습니다.

 


 

#5. TWeakObjectPtr

 

1. 개념

TWeakObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로 UObject에 대한 약한 참조를 제공하는 스마트 포인터입니다. 

 

2. 특징

  1. 객체 수명에 영향 X
  2. 가비지 컬렉션 과정에서 null로 변경
  3. 순환 참조 문제 해결
  4. 객체의 유효성 검사

 

3. 코드

UPROPERTY()
TObjectPtr<UMyObject> ObjectPtr;

void UseObject()
{
    if (ObjectPtr)
    {
        ObjectPtr->DoSomething();
    }
}
// 가비지 컬렉션 중에 ObjectPtr은 자동으로 null로 설정될 수 있습니다.

 


 

#6. TSoftObjectPtr

 

1. 개념

TSoftObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로, UObject 및 파생 클래스 유형에 대한 느슨한 참조를 제공합니다. TSoftObjectPtr는 주로, 대용량 애셋의 지연 로딩, 순환 참조 방지, 모듈간 느슨한 결합, 데이터에서 애셋 참조를 관리하기 위해 활용됩니다.

 

2. 특징

  1. 지연 로딩: 객체를 즉시 로드하지 않고, 필요할 때 로드
  2. 비동기 로딩: 비동기적으로 로드하여 성능상 이점
  3. 직렬화 기능: 에디터와 게임 간 안전한 직렬화
  4. 널 안전성: 참조된 객체가 로드되지 않거나, 존재하지 않아도 안전
  5. 메모리 효율: 실제 객체 대신 경로 문자열만 저장

 

3. 동작 방식

  1. 내부적으로 FSoftObjectPath 활용하여 객체의 경로 저장
  2. 객체 접근 시 필요에 따라 객체를 로드 
  3. 로드된 객체애 대한 느슨한 참조 유지

 

4. 코드

UPROPERTY()
TSoftObjectPtr<UTexture2D> TexturePtr;

void LoadAndUseTexture()
{
    if (UTexture2D* Texture = TexturePtr.LoadSynchronous())
    {
        // 텍스처 사용
    }
    else
    {
        // 비동기 로드
        TexturePtr.LoadAsync();
    }
}
// TexturePtr은 객체가 메모리에 없어도 참조를 유지합니다.

 


 

#7. Summary

 

종류 장점 단점 활용처
TUniquePtr 1. 명확한 소유권
2. 메모리 누수 방지
3. 가장 적은 메모리 오버헤드
1. 복사 불가능 1. 독점 소유권 리소스
2.RAII 패턴 구현
3. 팩토리 함수 반환값
TSharedPtr 1. 공동 소유권
2. 자동 메모리 관리
1. 순환 참조 문제
2. 메모리 오버헤드
1. 공동 소유 리소스 
TWeakPtr 1. 순환 참조 방지
2. 객체 존재 여부 확인
3. 객체 수명과 연관 x
1. TSharedPtr에 의존적
2. 객체 접근 불가
1. 캐시 구현
2. 관찰자 패턴 구현
3. 콜백 
4. 순환 참조 방지

 

종류 장점 단점 활용처
TObjectPtr 1. UObject 최적화
2.가비지 컬렉션 지원
3. 직렬화와 네트워크 복사
1. UObject만 가능 1. 멤버 변수
2. Reflection
TWeakObjectPtr 1. UObject 최적화
2. 가비지 컬렉션 지원
3. 순환 참조 방지
1. 유효성 검사 필수
2. UObject만 가능
1. Delegate
2. 캐시
3. 임시 참조
TSoftObjectPtr 1. 비동기 로딩 지원
2. 메모리 로드 되지 않은 애셋 참조 가능
3.직렬화 지원
1. 접근 시 추가 로딩
2. 런 타임 오버헤드
1. 대용량 애셋 참조
2. 레벨 스트리밍
3. 지연 로