IdleTimeToGC
IdleTimeToGC
#Overview
name: IdleTimeToGC
The value of this variable can be defined or overridden in .ini config files. 1
.ini config file referencing this setting variable.
It is referenced in 7
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of IdleTimeToGC is to control the garbage collection behavior in the Unreal Engine’s cook-on-the-fly system. Specifically, it determines the amount of idle time allowed before forcing a garbage collection during the cooking process.
This setting variable is primarily used by the cook-on-the-fly system, which is part of the Unreal Engine’s editor subsystem. It’s implemented in the UCookOnTheFlyServer class, which is responsible for cooking game content on demand.
The value of this variable is set in the GEditorIni configuration file under the [CookSettings] section. It’s loaded during the initialization of the cook-on-the-fly server using the FInitializeConfigSettings::LoadLocal function.
IdleTimeToGC interacts with other memory management variables such as PackagesPerGC, MemoryMaxUsedVirtual, and MemoryMaxUsedPhysical. These variables collectively control the garbage collection behavior during the cooking process.
Developers should be aware that setting IdleTimeToGC to 0 will disable the idle-time-based garbage collection. This means garbage collection will only occur based on other triggers, such as the number of packages processed or memory usage thresholds.
Best practices when using this variable include:
- Adjust it based on your project’s specific needs and the available system resources.
- Consider the trade-off between frequent garbage collection (which can slow down the cooking process) and memory usage.
- Use it in conjunction with other memory management settings for optimal performance.
- Monitor the cooking process and adjust the value if you notice memory-related issues or performance problems.
- Document any custom settings used in your project to ensure consistency across different development environments.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseEditor.ini:351, section: [CookSettings]
- INI Section:
CookSettings
- Raw value:
20
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/CookOnTheSide/CookOnTheFlyServer.h:321
Scope (from outer to inner):
file
class class UCookOnTheFlyServer : public UObject, public FTickableEditorObject, public FExec, public UE::Cook::ICookInfo
Source code excerpt:
uint32 PackagesPerGC;
/** Amount of time that is allowed to be idle before forcing a garbage collect. Set to 0 to never force GC due to idle time */
double IdleTimeToGC;
/** Amount of time to wait when save and load are busy waiting on async operations before trying them again. */
float CookProgressRetryBusyPeriodSeconds = 0.f;
// Memory Limits for when to Collect Garbage
uint64 MemoryMaxUsedVirtual;
uint64 MemoryMaxUsedPhysical;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/CookOnTheFlyServer.cpp:5963
Scope (from outer to inner):
file
function double UCookOnTheFlyServer::GetIdleTimeToGC
Source code excerpt:
else
{
return IdleTimeToGC;
}
}
void UCookOnTheFlyServer::BeginDestroy()
{
ShutdownCookOnTheFly();
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/CookOnTheFlyServer.cpp:6883
Scope (from outer to inner):
file
namespace UE::Cook
function void FInitializeConfigSettings::LoadLocal
Source code excerpt:
}
IdleTimeToGC = 20.0;
GConfig->GetDouble( TEXT("CookSettings"), TEXT("IdleTimeToGC"), IdleTimeToGC, GEditorIni );
auto ReadMemorySetting = [](const TCHAR* SettingName, uint64& TargetVariable)
{
int32 ValueInMB = 0;
if (GConfig->GetInt(TEXT("CookSettings"), SettingName, ValueInMB, GEditorIni))
{
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Cooker/CookTypes.cpp:620
Scope (from outer to inner):
file
function FCbWriter& operator<<
Source code excerpt:
Writer << "PackagesPerGC" << Value.PackagesPerGC;
Writer << "MemoryExpectedFreedToSpreadRatio" << Value.MemoryExpectedFreedToSpreadRatio;
Writer << "IdleTimeToGC" << Value.IdleTimeToGC;
Writer << "MemoryMaxUsedVirtual" << Value.MemoryMaxUsedVirtual;
Writer << "MemoryMaxUsedPhysical" << Value.MemoryMaxUsedPhysical;
Writer << "MemoryMinFreeVirtual" << Value.MemoryMinFreeVirtual;
Writer << "MemoryMinFreePhysical" << Value.MemoryMinFreePhysical;
Writer << "MemoryTriggerGCAtPressureLevel" << static_cast<uint8>(Value.MemoryTriggerGCAtPressureLevel);
Writer << "bUseSoftGC" << Value.bUseSoftGC;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Cooker/CookTypes.cpp:646
Scope (from outer to inner):
file
function bool LoadFromCompactBinary
Source code excerpt:
bOk = LoadFromCompactBinary(Field["PackagesPerGC"], OutValue.PackagesPerGC) & bOk;
bOk = LoadFromCompactBinary(Field["MemoryExpectedFreedToSpreadRatio"], OutValue.MemoryExpectedFreedToSpreadRatio) & bOk;
bOk = LoadFromCompactBinary(Field["IdleTimeToGC"], OutValue.IdleTimeToGC) & bOk;
bOk = LoadFromCompactBinary(Field["MemoryMaxUsedVirtual"], OutValue.MemoryMaxUsedVirtual) & bOk;
bOk = LoadFromCompactBinary(Field["MemoryMaxUsedPhysical"], OutValue.MemoryMaxUsedPhysical) & bOk;
bOk = LoadFromCompactBinary(Field["MemoryMinFreeVirtual"], OutValue.MemoryMinFreeVirtual) & bOk;
bOk = LoadFromCompactBinary(Field["MemoryMinFreePhysical"], OutValue.MemoryMinFreePhysical) & bOk;
uint8 PressureLevelAsInt;
if (LoadFromCompactBinary(Field["MemoryTriggerGCAtPressureLevel"], PressureLevelAsInt))
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Cooker/CookTypes.cpp:683
Scope (from outer to inner):
file
namespace UE::Cook
function void FInitializeConfigSettings::MoveOrCopy
Source code excerpt:
Target.PackagesPerGC = Source.PackagesPerGC;
Target.MemoryExpectedFreedToSpreadRatio = Source.MemoryExpectedFreedToSpreadRatio;
Target.IdleTimeToGC = Source.IdleTimeToGC;
Target.MemoryMaxUsedVirtual = Source.MemoryMaxUsedVirtual;
Target.MemoryMaxUsedPhysical = Source.MemoryMaxUsedPhysical;
Target.MemoryMinFreeVirtual = Source.MemoryMinFreeVirtual;
Target.MemoryMinFreePhysical = Source.MemoryMinFreePhysical;
Target.MemoryTriggerGCAtPressureLevel = Source.MemoryTriggerGCAtPressureLevel;
Target.bUseSoftGC = Source.bUseSoftGC;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Cooker/CookTypes.h:315
Scope (from outer to inner):
file
namespace UE::Cook
Source code excerpt:
uint32 PackagesPerGC = 0;
float MemoryExpectedFreedToSpreadRatio = 0.f;
double IdleTimeToGC = 0.;
uint64 MemoryMaxUsedVirtual;
uint64 MemoryMaxUsedPhysical;
uint64 MemoryMinFreeVirtual;
uint64 MemoryMinFreePhysical;
FGenericPlatformMemoryStats::EMemoryPressureStatus MemoryTriggerGCAtPressureLevel;
int32 MinFreeUObjectIndicesBeforeGC;