Smart Pointer

  • 구조
  • 구성
  Own the object Prevent Deletion Unique Property Converted by
TSharedPtr yes yes
(ref counting)
can point null MakeShared()
TSharedRef yes yes must point valid object MakeShareable()
TWeakPtr no no breaks ref cycle  
  • TSharePtr - 참조 카운트 기반 GC, 오브젝트 소유
  • TShareRef - Ptr과 동일하나, null값 미허용
  • TWeakPtr - Ptr과 동일하나, 오브젝트 미소유
  • TUniquePtr - Ptr과 동일하나, 하나의 오브젝트는 여러개의 UniquePtr을 가질 수 없음 ( 소유권 이전은 가능 )
  • ( MakeSharable )

 

Hard, Soft referencing

    • A가 B를 Hard Reference 하고 있다면, A가 로딩될 때 B도 로딩된다.
      반면 A가 B를 Soft Reference 한다면, B 애셋의 경로 등을 string의 형태로 가지고 있다는 뜻이다.

Direct Property Reference (Hard Reference)

    • UPROPERTY를 붙여 변수를 선언하면, 해당 변수(혹은 블루프린트)가 로드될 때 이에 대응하는 애셋 또한 로딩된다.
    • Hard Reference
      /** construction start sound stinger */
      UPROPERTY(EditDefaultsOnly, Category=Building)
      USoundCue* ConstructionStartStinger;

Construction Time Reference (Hard Reference)

    • ConstructorHelpers 클래스를 이용해 애셋을 로딩할 때도 동일하다.
    • Hard Reference
      /** gray health bar texture */
      UPROPERTY()
      class UTexture2D* BarFillTexture;
       
      AStrategyHUD::AStrategyHUD(const FObjectInitializer& ObjectInitializer) :
          Super(ObjectInitializer)
      {
          static ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill"));
          assert(nullptr != BarFillObj);
          BarFillTexture = BarFillObj.Object;
      }

Indirect Property Reference (Soft Reference)

    • FSoftObjectPath를 이용해 경로를 보관한다. 그 후 TSoftObjectPtr를 사용해 템플릿화 된 코드를 저장한다.
      실제로 애셋을 로딩할 때는 LoadObject<T>() 함수를 호출해야 한다.
    • Soft Reference
      UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category=Building)
      TSoftObjectPtr<UStaticMesh> BaseMesh;
       
      UStaticMesh* GetLazyLoadedMesh()
      {
          if (BaseMesh.IsPending())
          {
              const FSoftObjectPath& AssetRef = BaseMesh.ToStringReference();
              BaseMesh = Cast< UStaticMesh>(Streamable.SynchronousLoad(AssetRef));
          }
          return BaseMesh.Get();
      }

Find / Load Object (Soft Reference)

    • UPROPERTY를 이용하지 않고, 애셋과 경로 정보를 가지고 직접 애셋을 로드할 수 도 있다.
      만약 이미 로드된 애셋(혹은 UObject)을 찾는다면 FindObject<T>()를 사용하면 된다.
      만약 로드되지 않은 애셋을 로드하고 싶다면 LoadObject<T>()를 사용한다.
    • Soft Reference
      AFunctionalTest* TestToRun = FindObject<AFunctionalTest>(TestsOuter, *TestName);
      GridTexture = LoadObject<UTexture2D>(NULL, TEXT("/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid"), NULL, LOAD_None, NULL);

 

Container

  • Common
    • 값복사 : FMemory::Memcpy( {복사될 컨테이너}, {복사할 컨테이너}, 복사할 메모리 크기 ( ex, sizeof(int32) * {복사될 컨테이너}.Num )
    • 언리얼 배열 초기화 : { 값1, 값2, ... 값n }
    • 기본 메서드
      • Num : 배열 길이 반환
      • Add / Emplace : 끝에 값 추가 ( add는 임시변수에 넣은 다음 컨테이너에 복사하므로, 보통 emplace가 낫다는듯 )
    • Contains는 체크용. (if true, get return)값도 얻을거면 Find

 

 

 

  •  TMap
    • key-value map
    • Find( {key} ) → return할때 value의 pointer를 반환하는것에 주의
    • 동적배열이라 iteration 속도 괜춘
    • 해시 기반이라 searching 빠름 ( TSet 형태 따름 )
      • 기본이 key값 Unique. key값 중복 필요하면 TMultiMap 사용
    • TSet의 항목을 TPair<KeyType, ValueType>으로 구성한 구조

 

  • UStruct
    • Generated_body 매크로 선언시, 실제로는 UScriptStruct 클래스로 구현됨
      • 제한적 리플렉션. UPROPERTY만 선언가능, UFUNCTION은 불가
    • F가 접두로 붙음
      • 힙 메모리 할당(포인터 연산) 없이 스택내 데이터로 사용 ( new, newobject 사용 불가 )

 

 

Serialize

  • Path Manager
    • FPaths
      • <FString> Combine ( <FString> PrePath, <FString> PostPath ) : 경로 string을 합쳐주는듯..? 그냥 concat, join이랑 동일한듯..?
        • 사이에 "/" 붙여주는 듯
      • <void> MakeStandardFileName ( <FString> 변환할 ptr ) : 변환할 ptr을 스탠다트 경로로 바꿔줌 ( 절대경로)
        • 현재의 상대경로를 절대경로로 변경 해줌
    • FPlatformMisc
      • <FString> ProjectDir( ) : 프로젝트 루트 경로 반환

 

'Unreal > UE Architecture' 카테고리의 다른 글

Cpp -> BP Pipeline 1  (0) 2024.05.17
문자열 처리  (0) 2024.05.16
UE Macro & Reflection System  (0) 2024.05.16
Input  (0) 2024.05.16
기본 구성  (0) 2024.05.16

+ Recent posts