<UE4>分析UObjectBase

来源:互联网 发布:淘宝权限管理 编辑:程序博客网 时间:2024/06/11 20:50
初略的看了下UE4的最上层的基类,可以知道大概是一些flag的操作和name和class 。UObjectBase的CPP文件相对复杂,粗略看一下。大概知道有什么东西就好。待真正用到再回头细看
class COREUOBJECT_API UObjectBase{/** 一些友元*/friend class UObjectBaseUtility;friend COREUOBJECT_API class UClass* Z_Construct_UClass_UObject();friend class FUObjectArray; // for access to InternalIndex without revealing it to anyone elsefriend class FUObjectAllocator; // for access to destructor without revealing it to anyone elsefriend COREUOBJECT_API void UObjectForceRegistration(UObjectBase* Object);friend COREUOBJECT_API void InitializePrivateStaticClass(class UClass* TClass_Super_StaticClass,class UClass* TClass_PrivateStaticClass,class UClass* TClass_WithinClass_StaticClass,const TCHAR* PackageName,const TCHAR* Name);protected:/** 三种构造函数*/UObjectBase() : NamePrivate(NoInit)  // screwy, but the name was already set and we don't want to set it again{}/** * Constructor used for bootstrapping * @paramInFlagsRF_Flags to assign */UObjectBase( EObjectFlags InFlags );public:/** * Constructor used by StaticAllocateObject * @paramInClassnon NULL, this gives the class of the new object, if known at this time * @paramInFlagsRF_Flags to assign * @paramInInternalFlags EInternalObjectFlags to assign * @paramInOuterouter for this object * @paramInNamename of the new object */UObjectBase( UClass* InClass, EObjectFlags InFlags, EInternalObjectFlags InInternalFlags, UObject *InOuter, FName InName );/** 析构函数*/virtual ~UObjectBase();/** 发送GC */static void EmitBaseReferences(UClass *RootClass);protected:/** 改变稀哈中的名字*/void LowLevelRename(FName NewName,UObject *NewOuter = NULL);/** 注册依赖*/virtual void RegisterDependencies() {}/** 排队注册*/void Register(const TCHAR* PackageName,const TCHAR* Name);/** 延续注册*/virtual void DeferredRegister(UClass *UClassStaticClass,const TCHAR* PackageName,const TCHAR* Name);private:/** 增加一个object*/void AddObject(FName Name, EInternalObjectFlags InSetInternalFlags);public:/** 检测对象是否有效*/bool IsValidLowLevel() const;/** 更快的检测对象是否有效*/bool IsValidLowLevelFast(bool bRecursive = true) const;/** 获取对象唯一ID*/FORCEINLINE uint32 GetUniqueID() const{return (uint32)InternalIndex;}/** 获取对象class*/FORCEINLINE UClass* GetClass() const{return ClassPrivate;}/** 获取Outer*/FORCEINLINE UObject* GetOuter() const{return OuterPrivate;}/** 获取Name*/FORCEINLINE FName GetFName() const{return NamePrivate;}/** 获取统计ID*/FORCEINLINE TStatId GetStatID(bool bForDeferredUse = false) const{#if STATS// this is done to avoid even registering stats for a disabled group (unless we plan on using it later)if (bForDeferredUse || FThreadStats::IsCollectingData(GET_STATID(STAT_UObjectsStatGroupTester))){if (!StatID.IsValidStat()){CreateStatID();}return StatID;}#endifreturn TStatId(); // not doing stats at the moment, or ever}private:/** 创建统计ID*/#if STATSvoid CreateStatID() const;#endifprotected:/** 设置flag*/FORCEINLINE void SetFlagsTo( EObjectFlags NewFlags ){checkfSlow((NewFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as 0x%x but is trying to set flags to RF_AllFlags"), *GetFName().ToString(), (int)ObjectFlags);ObjectFlags = NewFlags;}public:/** 获取flag*/FORCEINLINE EObjectFlags GetFlags() const{checkfSlow((ObjectFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as RF_AllFlags"), *GetFName().ToString());return ObjectFlags;}/** 原子的设置flags,用于并行GC和UObject线程加载*/FORCENOINLINE void AtomicallySetFlags( EObjectFlags FlagsToAdd ){int32 OldFlags = 0;int32 NewFlags = 0;do {OldFlags = ObjectFlags;NewFlags = OldFlags | FlagsToAdd;}while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags );}/** 原子的清理flags,用于并行GC和UObject线程加载*/FORCENOINLINE void AtomicallyClearFlags( EObjectFlags FlagsToClear ){int32 OldFlags = 0;int32 NewFlags = 0;do {OldFlags = ObjectFlags;NewFlags = OldFlags & ~FlagsToClear;}while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags );}private:/** 对象flags*/EObjectFlagsObjectFlags;/** 内部索引*/int32InternalIndex;/** class*/UClass*ClassPrivate;/** name*/FNameNamePrivate;/** outer*/UObject*OuterPrivate;/** 对象的统计ID 0是不统计*/STAT(mutable TStatIdStatID;)/** 重新编译的class*/friend class FBlueprintCompileReinstancer;/** 设置class*/void SetClass(UClass* NewClass);#if HACK_HEADER_GENERATOR/** 内部序列化*/friend struct FObjectBaseArchiveProxy;#endif // HACK_HEADER_GENERATOR};


                                             
0 0
原创粉丝点击