UE4 FName & GObject

FName就是NamePoolData
GObject就是GUObjectArray

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
__int64 __fastcall FName::GetPlainNameString(_DWORD *a1, __int64 a2)
{
__int64 v3; // rbx
RTL_SRWLOCK *v4; // r8
int v6; // [rsp+34h] [rbp+Ch]

v3 = HIWORD(*a1);
v6 = (unsigned __int16)*a1;
if ( byte_148D8736C )
{
v4 = &stru_148D9B9C0;
}
else
{
v4 = (RTL_SRWLOCK *)FNamePool::FNamePool((FNamePool *)&stru_148D9B9C0); //NamePoolData
byte_148D8736C = 1;
}
FNameEntry::GetPlainNameString((char *)v4[v3 + 2].Ptr + (unsigned int)(2 * v6), a2);
return a2;
}


void UObjectBaseInit(void)
{
unsigned int v0; // ecx
char v1; // bl
......

if ( *((int *)CpuChannel + 6) < 0 )
{
v0 = dword_148DBD114;
}
else
{
......
}
......

GUObjectAllocator = v13;
qword_148DBCD48 = (__int64)FMemory::MallocPersistentAuxiliary(v13, 0);
qword_148DBCD50 = qword_148DBCD48;
qword_148DBCD58 = qword_148DBCD48;
FUObjectArray::AllocateObjectPool((FUObjectArray *)&GUObjectArray, v14, v12, v11); //An instance of FUObjectArray
InitAsyncThread();
byte_148DBCFC8 = 1;
sub_142058840();
FScopedBootTiming::~FScopedBootTiming((FScopedBootTiming *)v10);
if ( v1 )
FCpuProfilerTrace::OutputEndEvent();
}

GUObjectArray是FUObjectArray的一个实例化对象 GetPlainNameString
其结构为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class COREUOBJECT_API FUObjectArray
{
public:
......
private:
typedef FChunkedFixedUObjectArray TUObjectArray;
int32 ObjFirstGCIndex;
int32 ObjLastNonGCIndex;
int32 MaxObjectsNotConsideredByGC;
bool OpenForDisregardForGC;
/** Array of all live objects.*/
TUObjectArray ObjObjects;
FCriticalSection ObjObjectsCritical;
TLockFreePointerListUnordered<int32, PLATFORM_CACHE_LINE_SIZE> ObjAvailableList;
#if UE_GC_TRACK_OBJ_AVAILABLE
FThreadSafeCounter ObjAvailableCount;
#endif
};

NamePoolData是FNamePool的一个实例化对象
其结构为

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
struct FNameEntryAllocator{
mutable PVOID Lock;
unsigned int CurrentBlock;
unsigned int CurrentByCursor;
PVOID Blocks[FNameMaxBlocks];
}

struct FNamePool{
FNameEntryAllocator Entires;
...
}

//这里Blocks,可以理解为每个NamePool的一个块。在该块中,每个条目由FNameEntry构成

//FNameEntry具有以下结构。

struct FNameEntryHeader {
USHORT bIsWide : 1;
USHORT Len : 15;
};

struct FNameEntry {
FNameEntryHeader Header;
union
{
char AnsiName[NAME_SIZE];
wchar_t WideName[NAME_SIZE];
};
}

UE4 FName & GObject
https://rogxo.github.io/2022/09/20/2022-09-20-UE4 FName & GObject/
作者
Rogxo
发布于
2022年9月20日
许可协议
CC BY-NC-SA 4.0