Visual Studio
[UE] TObjectKey, FObjectKey에 대하여 본문
TMap의 키값으로 UObject 객체를 사용할 경우 Raw Pointer나 TObjectPtr 대신 TObjectKey를 사용할 수 있다.
근데 공식 문서 어디에도 TMap의 키값으로 TObjectKey를 권장한다는 내용이 없는 걸 보니 무조건 써야 하는 것은 아닌 듯 하다.
TObjectKey에는 FObjectKey 타입의 ObjectKey 멤버가 있는데, FObjectKey::ObjectIndex를 먼저 비교하고 동일할 시 FObjectKey::ObjectSerialNumber를 비교한다.
어차피 64비트에서는 모든 연산이 64비트로 이뤄지므로 오히려 포인터보다 비교 연산자의 성능이 떨어질 것으로 예상된다.
Type Hash를 구하는 과정에서도 포인터 타입은 UE::Private::MurmurFinalize32() 함수를 사용하고, FObjectKey는 HashCombine(ObjectIndex, ObjectSerialNumber)로 구하는데 이 역시 포인터의 경우가 연산 횟수가 적다.
따라서 일반적인 경우에는 포인터를 사용하는 것이 좋아 보이나, UProperty에서 레퍼런스 카운트를 피하기 위해 사용할 경우에는 쓸모가 있어 보인다. (다만 이것도 UE5에서는 TWeakObjectPtr을 대신 사용할 수 있음.)
참고한 코드
- Runtime/Core/Public/Templates/TypeHash.h
- Runtime/CoreUObject/Public/UObject/ObjectKey.h
'Game Engine' 카테고리의 다른 글
[UE] Unreal Engine 소스 기여 경험 (0) | 2024.07.14 |
---|---|
[UE] SWindow 생성시 윈도우 크기를 임의로 설정하는 방법 (0) | 2024.06.18 |
[UE4/5] Unreal Editor 관련 코드 작성시 유용한 클래스들 (0) | 2024.04.08 |
Unreal C++ 관련 팁 모음 (UE5 기준) (0) | 2024.01.16 |
Fast Object Picking (0) | 2022.08.29 |