Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

Visual Studio

[UE] TObjectKey, FObjectKey에 대하여 본문

Game Engine

[UE] TObjectKey, FObjectKey에 대하여

emacser 2024. 5. 7. 17:01

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