UE网络-WithAddStructReferencedObjects详解

WithAddStructReferencedObjects是什么

成员内部属性防止GC.

示例

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
USTRUCT()
struct FTestNetSerializeSharedPtrContainer
{
GENERATED_USTRUCT_BODY()

uint32 CounterUniqueID = 0;
TSharedPtr<FTestNetSerializeSharedPtrBase> Data;

/** Serialize the root motion sources and their states for this group */
bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess);

bool Identical(const FTestNetSerializeSharedPtrContainer* Other, uint32 PortFlags) const;
void AddStructReferencedObjects();
};

template<>
struct TStructOpsTypeTraits< FTestNetSerializeSharedPtrContainer > : public TStructOpsTypeTraitsBase2< FTestNetSerializeSharedPtrContainer >
{
enum
{
WithNetSerializer = true,
WithIdentical = true,
WithCopy = true,
WithAddStructReferencedObjects = true
};
};

WithAddStructReferencedObjects映射到EStructFlags::STRUCT_AddStructReferencedObjects

在构建TCppStructOps时候会生成对应的枚举值:

UScriptStruct::PrepareCppStructOps中判断是否包含WithAddStructReferencedObjects.

调用堆栈:

获取函数指针, 并存储.

最终调用的是:CPPSTRUCT::AddStructReferencedObjects

提取之前存储的函数指针, 并进行调用.

堆栈: