void
UObjectBaseInit()
{
SCOPED_BOOT_TIMING(
"UObjectBaseInit"
);
int32 MaxObjectsNotConsideredByGC = 0;
int32 SizeOfPermanentObjectPool = 0;
int32 MaxUObjects = 2 * 1024 * 1024;
bool
bPreAllocateUObjectArray =
false
;
if
(FPlatformProperties::RequiresCookedData())
{
if
(IsRunningCookOnTheFly())
{
GCreateGCClusters =
false
;
}
else
{
GConfig->GetInt(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.MaxObjectsNotConsideredByGC"
), MaxObjectsNotConsideredByGC, GEngineIni);
GConfig->GetInt(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.SizeOfPermanentObjectPool"
), SizeOfPermanentObjectPool, GEngineIni);
}
GConfig->GetInt(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.MaxObjectsInGame"
), MaxUObjects, GEngineIni);
GConfig->GetBool(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.PreAllocateUObjectArray"
), bPreAllocateUObjectArray, GEngineIni);
}
else
{
#if IS_PROGRAM
MaxUObjects = 100000;
GConfig->GetInt(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.MaxObjectsInProgram"
), MaxUObjects, GEngineIni);
#else
GConfig->GetInt(TEXT(
"/Script/Engine.GarbageCollectionSettings"
), TEXT(
"gc.MaxObjectsInEditor"
), MaxUObjects, GEngineIni);
#endif
}
if
(MaxObjectsNotConsideredByGC <= 0 && SizeOfPermanentObjectPool > 0)
{
SizeOfPermanentObjectPool = 0;
UE_LOG(LogInit, Warning, TEXT(
"Disabling permanent object pool because disregard for GC is disabled (gc.MaxObjectsNotConsideredByGC=%d)."
), MaxObjectsNotConsideredByGC);
}
UE_LOG(LogInit, Log, TEXT(
"%s for max %d objects, including %i objects not considered by GC, pre-allocating %i bytes for permanent pool."
),
bPreAllocateUObjectArray ? TEXT(
"Pre-allocating"
) : TEXT(
"Presizing"
),
MaxUObjects, MaxObjectsNotConsideredByGC, SizeOfPermanentObjectPool);
GUObjectAllocator.AllocatePermanentObjectPool(SizeOfPermanentObjectPool);
GUObjectArray.AllocateObjectPool(MaxUObjects, MaxObjectsNotConsideredByGC, bPreAllocateUObjectArray);
#if UE_WITH_OBJECT_HANDLE_LATE_RESOLVE
UE::CoreUObject::Private::InitObjectHandles(GUObjectArray.GetObjectArrayCapacity());
#endif
void
InitGarbageElimination();
InitGarbageElimination();
void
InitAsyncThread();
InitAsyncThread();
Internal::GetUObjectSubsystemInitialised() =
true
;
UObjectProcessRegistrants();
}
void
FUObjectArray::AllocateObjectPool(int32 InMaxUObjects, int32 InMaxObjectsNotConsideredByGC,
bool
bPreAllocateObjectArray)
{
check(IsInGameThread());
MaxObjectsNotConsideredByGC = InMaxObjectsNotConsideredByGC;
ObjFirstGCIndex = DisregardForGCEnabled() ? -1 : 0;
check(ObjObjects.Num() == 0);
UE_CLOG(InMaxUObjects <= 0, LogUObjectArray, Fatal, TEXT(
"Max UObject count is invalid. It must be a number that is greater than 0."
));
ObjObjects.PreAllocate(InMaxUObjects, bPreAllocateObjectArray);
if
(MaxObjectsNotConsideredByGC > 0)
{
ObjObjects.AddRange(MaxObjectsNotConsideredByGC);
}
}