DeviceProfileName
DeviceProfileName
#Overview
name: DeviceProfileName
The value of this variable can be defined or overridden in .ini config files. 5
.ini config files referencing this setting variable.
It is referenced in 61
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of DeviceProfileName is to identify and manage device-specific configurations in Unreal Engine 5. Here’s a detailed explanation:
-
Purpose: DeviceProfileName is used to specify a particular device profile, which contains hardware-specific settings and optimizations for different platforms or devices.
-
Subsystems and modules: This variable is primarily used in the Engine module, particularly in the DeviceProfileManager and related classes. It’s also referenced in the Core module for console variable (CVar) management.
-
Value setting: The value is typically set when initializing the DeviceProfileManager or when selecting a specific device profile for preview or emulation purposes.
-
Interaction with other variables: It often interacts with other configuration variables, especially console variables (CVars) that are specific to a device profile.
-
Special considerations:
- Developers should ensure that the specified DeviceProfileName exists and is properly configured.
- Changes to the active device profile may require reloading or re-applying settings to take effect.
-
Best practices:
- Use UDeviceProfileManager::Get().GetActiveDeviceProfileName() to retrieve the current active profile name.
- When setting a new profile, use UDeviceProfileManager::Get().SetActiveDeviceProfile() instead of directly modifying the DeviceProfileName.
- Always validate the existence of a device profile before using it in code.
- Consider the implications of changing device profiles during runtime, as it may affect performance and rendering settings.
DeviceProfileName is crucial for tailoring the engine’s behavior to specific hardware configurations, allowing developers to optimize performance and features for various platforms and devices.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/Android/DataDrivenPlatformInfo.ini:32, section: [PreviewPlatform AndroidES31]
- INI Section:
PreviewPlatform AndroidES31
- Raw value:
Android_Preview_OpenGL
- Is Array:
False
Location: <Workspace>/Engine/Config/Android/DataDrivenPlatformInfo.ini:43, section: [PreviewPlatform AndroidVulkan]
- INI Section:
PreviewPlatform AndroidVulkan
- Raw value:
Android_Preview_Vulkan
- Is Array:
False
Location: <Workspace>/Engine/Config/Android/DataDrivenPlatformInfo.ini:54, section: [PreviewPlatform AndroidVulkanSM5]
- INI Section:
PreviewPlatform AndroidVulkanSM5
- Raw value:
Android_Vulkan_SM5
- Is Array:
False
Location: <Workspace>/Engine/Config/IOS/DataDrivenPlatformInfo.ini:35, section: [PreviewPlatform IOSMetal]
- INI Section:
PreviewPlatform IOSMetal
- Raw value:
IOS,iPhone6S,iPadPro6_129
- Is Array:
False
Location: <Workspace>/Engine/Config/IOS/DataDrivenPlatformInfo.ini:47, section: [PreviewPlatform IOSMetalSM5]
- INI Section:
PreviewPlatform IOSMetalSM5
- Raw value:
IOS
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Editor/DeviceProfileServices/Private/DeviceProfileServicesUIManager.cpp:99
Scope (from outer to inner):
file
function void FDeviceProfileServicesUIManager::SetProfile
Source code excerpt:
void FDeviceProfileServicesUIManager::SetProfile( const FString& DeviceProfileName )
{
// Save the profile name to an ini file
if ( DeviceProfileName != TEXT( "Default" ) )
{
const FString INISection = "SelectedProfile"; // Section in the game ini to store our selections
const FString INIKeyBase = "ProfileItem"; // Key to the stored device profiles
const int32 MaxItems = 4; // Max history
// Array to store the existing items
#Loc: <Workspace>/Engine/Source/Editor/DeviceProfileServices/Private/DeviceProfileServicesUIManager.cpp:122
Scope (from outer to inner):
file
function void FDeviceProfileServicesUIManager::SetProfile
Source code excerpt:
// Remove the current item if it exists - we will re-add it at the top of the array later
const int32 ItemIndex = CurItems.Find( DeviceProfileName );
if ( ItemIndex != INDEX_NONE )
{
CurItems.RemoveAt( ItemIndex );
}
else if ( CurItems.Num() == MaxItems )
{
#Loc: <Workspace>/Engine/Source/Editor/DeviceProfileServices/Private/DeviceProfileServicesUIManager.cpp:134
Scope (from outer to inner):
file
function void FDeviceProfileServicesUIManager::SetProfile
Source code excerpt:
// Add the new profile to the top of the array
CurItems.Insert( DeviceProfileName, 0 );
// Clear the ini section
GConfig->EmptySection( *INISection, GEditorPerProjectIni );
// Re-write the .ini file
for ( int32 ItemIdx = 0; ItemIdx < CurItems.Num(); ++ItemIdx )
#Loc: <Workspace>/Engine/Source/Editor/DeviceProfileServices/Private/DeviceProfileServicesUIManager.h:34
Scope (from outer to inner):
file
class class FDeviceProfileServicesUIManager : public IDeviceProfileServicesUIManager
Source code excerpt:
virtual void GetProfilesByType( TArray<UDeviceProfile*>& OutDeviceProfiles, const FString& InType ) override;
virtual const FName GetPlatformIconName( const FString& DeviceName ) const override;
virtual void SetProfile( const FString& DeviceProfileName ) override;
protected:
/** Generates the UI icon list. */
void CreatePlatformMap();
#Loc: <Workspace>/Engine/Source/Editor/DeviceProfileServices/Public/IDeviceProfileServicesUIManager.h:55
Scope (from outer to inner):
file
class class IDeviceProfileServicesUIManager
Source code excerpt:
* Set a profile - add the type to an INI file so it can be used in a history view.
*
* @param DeviceProfileName The platform type.
*/
virtual void SetProfile( const FString& DeviceProfileName ) = 0;
};
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/LevelEditor.cpp:1824
Scope (from outer to inner):
file
function void FLevelEditorModule::BindGlobalLevelEditorCommands
lambda-function
Source code excerpt:
const ERHIFeatureLevel::Type FeatureLevel = GetMaxSupportedFeatureLevel(ShaderPlatform);
return FPreviewPlatformInfo(FeatureLevel, ShaderPlatform, Item.PlatformName, Item.ShaderFormat, Item.DeviceProfileName, true, Item.PreviewShaderPlatformName);
};
FPreviewPlatformInfo PreviewFeatureLevelInfo = GetPreviewFeatureLevelInfo();
ActionList.MapAction(
Commands.PreviewPlatformOverrides[Index],
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/LevelEditorActions.cpp:3975
Scope: file
Source code excerpt:
FUICommandInfoDecl(
this->AsShared(),
FName(*FString::Printf(TEXT("PreviewPlatformOverrides_%s_%s_%s"), *Item.PlatformName.ToString(), *Item.ShaderFormat.ToString(), *Item.DeviceProfileName.ToString())),
FriendlyNameBuilder.ToText(),
Item.MenuTooltip)
.UserInterfaceType(EUserInterfaceActionType::Check)
.DefaultChord(FInputChord())
);
}
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/SLevelViewportToolBar.cpp:455
Scope (from outer to inner):
file
function const FSlateBrush* SLevelViewportToolBar::GetDevicePreviewMenuLabelIcon
Source code excerpt:
{
TSharedRef<SLevelViewport> ViewportRef = Viewport.Pin().ToSharedRef();
FString DeviceProfileName = ViewportRef->GetDeviceProfileString();
FName PlatformIcon = NAME_None;
if( !DeviceProfileName.IsEmpty() && DeviceProfileName != "Default" )
{
static FName DeviceProfileServices( "DeviceProfileServices" );
IDeviceProfileServicesModule& ScreenDeviceProfileUIServices = FModuleManager::LoadModuleChecked<IDeviceProfileServicesModule>(TEXT( "DeviceProfileServices"));
IDeviceProfileServicesUIManagerPtr UIManager = ScreenDeviceProfileUIServices.GetProfileServicesManager();
PlatformIcon = UIManager->GetDeviceIconName( DeviceProfileName );
return FAppStyle::GetOptionalBrush( PlatformIcon );
}
return nullptr;
}
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/SLevelViewportToolBar.cpp:941
Scope (from outer to inner):
file
function void SLevelViewportToolBar::SetLevelProfile
Source code excerpt:
}
void SLevelViewportToolBar::SetLevelProfile( FString DeviceProfileName )
{
TSharedRef<SLevelViewport> ViewportRef = Viewport.Pin().ToSharedRef();
ViewportRef->SetDeviceProfileString( DeviceProfileName );
IDeviceProfileServicesModule& ScreenDeviceProfileUIServices = FModuleManager::LoadModuleChecked<IDeviceProfileServicesModule>(TEXT( "DeviceProfileServices"));
IDeviceProfileServicesUIManagerPtr UIManager = ScreenDeviceProfileUIServices.GetProfileServicesManager();
UIManager->SetProfile( DeviceProfileName );
}
void SLevelViewportToolBar::GeneratePlacedCameraMenuEntries(FToolMenuSection& Section, TArray<ACameraActor*> Cameras) const
{
FSlateIcon CameraIcon( FAppStyle::GetAppStyleSetName(), "ClassIcon.CameraComponent" );
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/SLevelViewportToolBar.h:109
Scope (from outer to inner):
file
class class SLevelViewportToolBar : public SViewportToolBar
Source code excerpt:
* Set the level profile, and save the selection to an .ini file.
*
* @param DeviceProfileName - The selected device profile
*/
void SetLevelProfile( FString DeviceProfileName );
/**
* Generates the toolbar view mode options menu content
*
* @return The widget containing the options menu content
*/
TSharedRef<SWidget> GenerateOptionsMenu();
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Editor/EditorEngine.h:233
Scope (from outer to inner):
file
function FPreviewPlatformInfo
Source code excerpt:
, PreviewPlatformName(InPreviewPlatformName)
, PreviewShaderFormatName(InPreviewShaderFormatName)
, DeviceProfileName(InDeviceProfileName)
, bPreviewFeatureLevelActive(InbPreviewFeatureLevelActive)
, PreviewShaderPlatformName(InShaderPlatformName)
{}
/** The feature level we should use when loading or creating a new world */
ERHIFeatureLevel::Type PreviewFeatureLevel;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Editor/EditorEngine.h:251
Scope: file
Source code excerpt:
/** The device profile to preview. */
FName DeviceProfileName;
/** Is feature level preview currently active */
bool bPreviewFeatureLevelActive;
/** Preview Shader Platform Name */
FName PreviewShaderPlatformName;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Editor/EditorEngine.h:262
Scope (from outer to inner):
file
function bool Matches
Source code excerpt:
bool Matches(const FPreviewPlatformInfo& Other) const
{
return PreviewFeatureLevel == Other.PreviewFeatureLevel && ShaderPlatform == Other.ShaderPlatform && PreviewPlatformName == Other.PreviewPlatformName && PreviewShaderFormatName == Other.PreviewShaderFormatName && DeviceProfileName == Other.DeviceProfileName && PreviewShaderPlatformName == Other.PreviewShaderPlatformName;
}
/** Return platform name like "Android", or NAME_None if none is set or the preview feature level is not active */
FName GetEffectivePreviewPlatformName() const
{
return bPreviewFeatureLevelActive ? PreviewPlatformName : NAME_None;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/EditorEngine.cpp:7834
Scope (from outer to inner):
file
function static void SaveFeatureLevelAsDisabled
Source code excerpt:
Settings->bPreviewFeatureLevelActive = PreviewPlatform.bPreviewFeatureLevelActive;
Settings->bPreviewFeatureLevelWasDefault = (PreviewPlatform.PreviewFeatureLevel == GMaxRHIFeatureLevel);
Settings->PreviewDeviceProfileName = PreviewPlatform.DeviceProfileName;
Settings->PreviewShaderPlatformName = PreviewPlatform.PreviewShaderPlatformName;
}
void UEditorEngine::SetPreviewPlatform(const FPreviewPlatformInfo& NewPreviewPlatform, bool bSaveSettings)
{
// Get the requested preview platform, make sure it is valid.
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/EditorEngine.cpp:7937
Scope (from outer to inner):
file
function void UEditorEngine::SetPreviewPlatform
Source code excerpt:
{
//Override the current device profile.
if (PreviewPlatform.DeviceProfileName != NAME_None)
{
if (UDeviceProfile* DP = UDeviceProfileManager::Get().FindProfile(PreviewPlatform.DeviceProfileName.ToString(), false))
{
UDeviceProfileManager::Get().SetPreviewDeviceProfile(DP);
}
}
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/EditorEngine.cpp:7971
Scope (from outer to inner):
file
function void UEditorEngine::ToggleFeatureLevelPreview
Source code excerpt:
GShaderPlatformForFeatureLevel[PreviewPlatform.PreviewFeatureLevel] = PreviewPlatform.ShaderPlatform;
if (PreviewPlatform.DeviceProfileName != NAME_None)
{
if (UDeviceProfile* DP = UDeviceProfileManager::Get().FindProfile(PreviewPlatform.DeviceProfileName.ToString(), false))
{
UDeviceProfileManager::Get().SetPreviewDeviceProfile(DP);
}
}
else
{
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/EditorEngine.cpp:8077
Scope (from outer to inner):
file
function void UEditorEngine::SaveEditorFeatureLevel
Source code excerpt:
Settings->bPreviewFeatureLevelActive = PreviewPlatform.bPreviewFeatureLevelActive;
Settings->bPreviewFeatureLevelWasDefault = (PreviewPlatform.PreviewFeatureLevel == GMaxRHIFeatureLevel);
Settings->PreviewDeviceProfileName = PreviewPlatform.DeviceProfileName;
Settings->PreviewShaderPlatformName = PreviewPlatform.PreviewShaderPlatformName;
Settings->PostEditChange();
}
bool UEditorEngine::GetPreviewPlatformName(FName& PlatformName) const
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:475
Scope (from outer to inner):
file
function bool IConsoleManager::VisitPlatformCVarsForEmulation
Source code excerpt:
}
bool IConsoleManager::VisitPlatformCVarsForEmulation(FName PlatformName, const FString& DeviceProfileName, TFunctionRef<void(const FString& CVarName, const FString& CVarValue, EConsoleVariableFlags SetBy)> Visit)
{
// we can't get to Scalability code in here (it's in Engine) but we still want to apply the default level...
// there is a static_assert in UDeviceProfile::ExpandDeviceProfileCVars to make sure the default doesn't change from this value
const int DefaultScalabilityLevel = 3;
// get the config system for the platform the DP uses
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:573
Scope (from outer to inner):
file
function bool IConsoleManager::VisitPlatformCVarsForEmulation
Source code excerpt:
{
// skip this if we didn't specify one
if (DeviceProfileName.Len() == 0)
{
continue;
}
if (!FCoreDelegates::GatherDeviceProfileCVars.IsBound())
{
UE_LOG(LogConsoleManager, Warning, TEXT("Attempted to get CVars for another platform before FCoreDelegates::GatherDeviceProfileCVars was bound to a callback. CVar values are likely incorrect."));
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:587
Scope (from outer to inner):
file
function bool IConsoleManager::VisitPlatformCVarsForEmulation
Source code excerpt:
bDeleteSection = true;
UE_LOG(LogConsoleManager, Verbose, TEXT("Gathering device profile cvars for %s, platform config %s"), *DeviceProfileName, *PlatformName.ToString());
// run the delegate (this code can't get into DP code directly, so we use a delegate), and walk over the results
for (TPair<FName, FString>& Pair : FCoreDelegates::GatherDeviceProfileCVars.Execute(DeviceProfileName))
{
NewSection->Add(Pair);
UE_LOG(LogConsoleManager, Verbose, TEXT(" %s = %s"), *Pair.Key.ToString(), *Pair.Value);
}
Section = NewSection;
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:857
Scope (from outer to inner):
file
class class FConsoleVariableExtendedData : public FConsoleVariableBase
Source code excerpt:
#if ALLOW_OTHER_PLATFORM_CONFIG
virtual TSharedPtr<IConsoleVariable> GetPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName) override;
virtual bool HasPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName) override;
virtual void ClearPlatformVariables(FName PlatformName) override;
// cache of the values of this cvar on other platforms
TMap<FName, TSharedPtr<IConsoleVariable> > PlatformValues;
FRWLock PlatformValuesLock;
friend FConsoleManager;
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:1304
Scope: file
Source code excerpt:
* Platform name as the DP name. This matches up with how GetPlatformValueVariable() was generally used in the past - get the CVar using the platform-named
* DeviceProfile.
* If DeviceProfileName is the GSpecialDPNameForPremadePlatformKey, then that indicates PlatformName is already a PlatformKey that
* was created with this function before, so just return the PlatformName untouched. This makes is so we don't need two versions of functions
* that take a PlatformName and DeviceProfileName, and we don't need to keep re-creating PlatformKeys
*/
static FName MakePlatformKey(FName PlatformName, const FString& DeviceProfileName)
{
// a bit of a hack to say PlatformName is already a Key
if (DeviceProfileName == GSpecialDPNameForPremadePlatformKey || PlatformName == NAME_None)
{
return PlatformName;
}
return *(PlatformName.ToString() + TEXT("/") + (DeviceProfileName.Len() ? DeviceProfileName : PlatformName.ToString()));
}
template<class T>
bool FConsoleVariableExtendedData<T>::HasPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName)
{
// cheap lock here, contention is very rare
FRWScopeLock Lock(PlatformValuesLock, SLT_Write);
return PlatformValues.Contains(MakePlatformKey(PlatformName, DeviceProfileName));
}
template<class T>
TSharedPtr<IConsoleVariable> FConsoleVariableExtendedData<T>::GetPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName)
{
// if we have GSpecialDPNameForPremadePlatformKey passed in, we have already gone through the
// Load and we have a premade key in PlatformName
if (DeviceProfileName != GSpecialDPNameForPremadePlatformKey)
{
// make sure we have cached this platform/DP
IConsoleManager::Get().LoadAllPlatformCVars(PlatformName, DeviceProfileName);
}
// we have assumed in the past that we would return at least the constructor version, so create one if we are explicitly asking
// this can happen when .ini files don't give a value to a cvar, but we are asking for a platform's value anyway - in
// which case we want the constructor value, not the current platform's value
if (!HasPlatformValueVariable(PlatformName, DeviceProfileName))
{
FindOrCreatePlatformCVar(this, MakePlatformKey(PlatformName, DeviceProfileName));
}
// cheap lock here, contention is very rare
FRWScopeLock Lock(PlatformValuesLock, SLT_Write);
return PlatformValues.FindRef(MakePlatformKey(PlatformName, DeviceProfileName));
}
template<class T>
void FConsoleVariableExtendedData<T>::ClearPlatformVariables(FName PlatformName)
{
FRWScopeLock Lock(PlatformValuesLock, SLT_Write);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:2417
Scope (from outer to inner):
file
function static void SetUnsetCVar
Source code excerpt:
FString PlatformName;
FString DeviceProfileName;
int32 PlatformDelim = CVarName.Find(TEXT("@"));
if (PlatformDelim > 0)
{
PlatformName = CVarName.Mid(0, PlatformDelim);
if (PlatformName.Contains(TEXT("/")))
{
FString Plat;
PlatformName.Split(TEXT("/"), &Plat, &DeviceProfileName);
PlatformName = *Plat;
}
CVarName = CVarName.Mid(PlatformDelim + 1);
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:2445
Scope (from outer to inner):
file
function static void SetUnsetCVar
Source code excerpt:
if (PlatformName.Len())
{
CVar = CVar->GetPlatformValueVariable(*PlatformName, *DeviceProfileName).Get();
if (CVar == nullptr)
{
Ar.Logf(TEXT("Failed to get CVar for platform %s"), *PlatformName);
return;
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:2539
Scope (from outer to inner):
file
function bool FConsoleManager::ProcessUserConsoleInput
Source code excerpt:
// look for the <cvar>@<platform[/deviceprofile]> syntax
FName PlatformName;
FString DeviceProfileName;
if (Param1.Contains(TEXT("@")))
{
FString Left, Right;
Param1.Split(TEXT("@"), &Left, &Right);
if (Left.Len() && Right.Len())
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:2551
Scope (from outer to inner):
file
function bool FConsoleManager::ProcessUserConsoleInput
Source code excerpt:
{
FString Plat;
Right.Split(TEXT("/"), &Plat, &DeviceProfileName);
PlatformName = *Plat;
}
else
{
PlatformName = *Right;
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:2595
Scope (from outer to inner):
file
function bool FConsoleManager::ProcessUserConsoleInput
Source code excerpt:
{
#if ALLOW_OTHER_PLATFORM_CONFIG
PlatformCVar = CVar->GetPlatformValueVariable(PlatformName, DeviceProfileName);
CVar = PlatformCVar.Get();
if (!CVar)
{
Ar.Logf(TEXT("Unable find CVar %s for platform %s (possibly invalid platform name?)"), *Param1, *PlatformName.ToString());
return false;
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3046
Scope (from outer to inner):
file
function void FConsoleManager::LoadAllPlatformCVars
Source code excerpt:
#if ALLOW_OTHER_PLATFORM_CONFIG
void FConsoleManager::LoadAllPlatformCVars(FName PlatformName, const FString& DeviceProfileName)
{
FName PlatformKey = MakePlatformKey(PlatformName, DeviceProfileName);
// protect the cached CVar info from two threads trying to get a platform CVar at once, and both attempting to load all of the cvars at the same time
FScopeLock Lock(&CachedPlatformsAndDeviceProfilesLock);
if (CachedPlatformsAndDeviceProfiles.Contains(PlatformKey))
{
return;
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3059
Scope (from outer to inner):
file
function void FConsoleManager::LoadAllPlatformCVars
Source code excerpt:
// use the platform's base DeviceProfile for emulation
VisitPlatformCVarsForEmulation(PlatformName, DeviceProfileName.IsEmpty() ? PlatformName.ToString() : DeviceProfileName,
[PlatformName, PlatformKey](const FString& CVarName, const FString& CVarValue, EConsoleVariableFlags SetByAndPreview)
{
// make sure the named cvar exists
IConsoleVariable* CVar = IConsoleManager::Get().FindConsoleVariable(*CVarName);
if (CVar == nullptr)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3082
Scope (from outer to inner):
file
function void FConsoleManager::PreviewPlatformCVars
Source code excerpt:
}
void FConsoleManager::PreviewPlatformCVars(FName PlatformName, const FString& DeviceProfileName, FName PreviewModeTag)
{
UE_LOG(LogConsoleManager, Display, TEXT("Previewing Platform '%s', DeviceProfile '%s', ModeTag '%s'"), *PlatformName.ToString(), *DeviceProfileName, *PreviewModeTag.ToString());
LoadAllPlatformCVars(PlatformName, DeviceProfileName.Len() ? DeviceProfileName : PlatformName.ToString());
FName PlatformKey = MakePlatformKey(PlatformName, DeviceProfileName);
for (auto Pair : ConsoleObjects)
{
if (IConsoleVariable* CVar = Pair.Value->AsVariable())
{
// we want Preview but not Cheat
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3117
Scope (from outer to inner):
file
function void FConsoleManager::ClearAllPlatformCVars
Source code excerpt:
}
void FConsoleManager::ClearAllPlatformCVars(FName PlatformName, const FString& DeviceProfileName)
{
FName PlatformKey = MakePlatformKey(PlatformName, DeviceProfileName);
// protect the cached CVar info from two threads trying to get a platform CVar at once, and both attempting to load all of the cvars at the same time
FScopeLock Lock(&CachedPlatformsAndDeviceProfilesLock);
if (!CachedPlatformsAndDeviceProfiles.Contains(PlatformKey))
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Misc/DataDrivenPlatformInfoRegistry.cpp:309
Scope (from outer to inner):
file
function static void ParsePreviewPlatforms
Source code excerpt:
for (int DPIndex = 0; DPIndex < DeviceProfileNames.Num(); DPIndex++)
{
Item.DeviceProfileName = *DeviceProfileNames[DPIndex].TrimStartAndEnd();
if (DPIndex < FriendlyNames.Num())
{
Item.OptionalFriendlyNameOverride = FText::FromString(FriendlyNames[DPIndex].TrimStartAndEnd());
}
else if (DeviceProfileNames.Num() > 1)
{
Item.OptionalFriendlyNameOverride = FText::FromString(Item.DeviceProfileName.ToString());
}
PreviewPlatformMenuItems.Add(Item);
}
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/HAL/ConsoleManager.h:89
Scope (from outer to inner):
file
class class FConsoleManager :public IConsoleManager
Source code excerpt:
CORE_API virtual void UnsetAllConsoleVariablesWithTag(FName Tag, EConsoleVariableFlags Priority) override;
#if ALLOW_OTHER_PLATFORM_CONFIG
CORE_API virtual void LoadAllPlatformCVars(FName PlatformName, const FString& DeviceProfileName=FString()) override;
CORE_API virtual void ClearAllPlatformCVars(FName PlatformName=NAME_None, const FString& DeviceProfileName=FString()) override;
CORE_API virtual void PreviewPlatformCVars(FName PlatformName, const FString& DeviceProfileName, FName PreviewModeTag) override;
#endif
private: // ----------------------------------------------------
/** Map of console variables and commands, indexed by the name of that command or variable */
// [name] = pointer (pointer must not be 0)
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/HAL/IConsoleManager.h:566
Scope (from outer to inner):
file
class class IConsoleVariable : public IConsoleObject
Source code excerpt:
* Note: If this causes a compile error due to pure virtual, make sure your IConsoleVariable subclass inherits from FConsoleVariableExtendedData
*/
virtual TSharedPtr<IConsoleVariable> GetPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName=FString()) = 0;
/**
* Checks if the CVar has a cached value for the given platform
*/
virtual bool HasPlatformValueVariable(FName PlatformName, const FString& DeviceProfileName=FString()) = 0;
/**
* Used only for debugging/iterating, this will clear all of the other platform's cvar objects, which will
* force a fresh lookup (with fresh ini files, likely) on next call to GetPlatformValueVariable
*/
virtual void ClearPlatformVariables(FName PlatformName=NAME_None)
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/HAL/IConsoleManager.h:1098
Scope: file
Source code excerpt:
*
* @param PlatformName The platform name (the ini name, so Windows, not Win64)
* @param DeviceProfileName If this is non-empty, the given deviceprofile will be loaded from the platform's inis and inserted into the CVars
* @param Visit the callback to run for each CVar found
*/
static CORE_API bool VisitPlatformCVarsForEmulation(FName PlatformName, const FString& DeviceProfileName, TFunctionRef<void(const FString& CVarName, const FString& CVarValue, EConsoleVariableFlags SetBy)> Visit);
/**
* Loads all platform cvars, which can be retrieved with IConsoleVariable::GetPlatformValueVariable. If DeviceProfileName is empty, it will use the
* DevicePlatform named the same as the Platform
*/
virtual void LoadAllPlatformCVars(FName PlatformName, const FString& DeviceProfileName=FString()) = 0;
/**
* Applies the cvars from the platform/DeviceProfile pair (can be blank to use the platform's named DP) and sets into the SetByPreview priority, with the PreviewModeTag
* to be unset later
*/
virtual void PreviewPlatformCVars(FName PlatformName, const FString& DeviceProfileName, FName PreviewModeTag) = 0;
/**
* Empties the cache for the given Platform/DP for all CVars. If using NAME_None for Platofrm, this will wipe every cached platform/DP value. If DeviceProfileName
* is empty, it will use the PlatfomName as the DeviceProfile name
*/
virtual void ClearAllPlatformCVars(FName PlatformName=NAME_None, const FString& DeviceProfileName=FString()) = 0;
#endif
/**
* When a plugin is unmounted, it needs to unset cvars that it had set when it was mounted. This will unset and fixup all
* variables with the given Tag
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/Misc/CoreDelegates.h:188
Scope (from outer to inner):
file
class class FCoreDelegates
Source code excerpt:
// Called when the CVar (ConsoleManager) needs to retrieve CVars for a deviceprofile for another platform - this dramatically simplifies module dependencies
typedef TMap<FName, FString> FCVarKeyValueMap;
static CORE_API TDelegate<FCVarKeyValueMap(const FString& DeviceProfileName)> GatherDeviceProfileCVars;
#endif
// Called when an error occurred.
static CORE_API FSimpleMulticastDelegate OnShutdownAfterError;
// Called when appInit is called, very early in startup
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/Misc/CoreDelegates.h:629
Scope (from outer to inner):
file
class class FCoreDelegates
Source code excerpt:
using FOnFileOpenedForReadFromPakFile UE_DEPRECATED(5.2, "Use template instantiation instead as `TMulticastDelegate<void(const TCHAR* PakFile, const TCHAR* FileName)>`") = TMulticastDelegate<void(const TCHAR* PakFile, const TCHAR* FileName)>;
#if ALLOW_OTHER_PLATFORM_CONFIG
using FGatherDeviceProfileCVars UE_DEPRECATED(5.2, "Use template instantiation instead as `TDelegate<FCVarKeyValueMap(const FString& DeviceProfileName)>`") = TDelegate<FCVarKeyValueMap(const FString& DeviceProfileName)>;
#endif
using FGatherAdditionalLocResPathsDelegate UE_DEPRECATED(5.2, "Use template instantiation instead as `TMulticastDelegate<void(TArray<FString>&)>`") = TMulticastDelegate<void(TArray<FString>&)>;
using FWorldOriginOffset UE_DEPRECATED(5.2, "Use template instantiation instead as `TMulticastDelegate<void(class UWorld*, FIntVector, FIntVector)>`") = TMulticastDelegate<void(class UWorld*, FIntVector, FIntVector)>;
using FStarvedGameLoop UE_DEPRECATED(5.2, "Use template instantiation instead as `TDelegate<void()>`") = TDelegate<void()>;
using FOnTemperatureChange UE_DEPRECATED(5.2, "Use template instantiation instead as `TMulticastDelegate<void(ETemperatureSeverity)>`") = TMulticastDelegate<void(ETemperatureSeverity)>;
using FOnLowPowerMode UE_DEPRECATED(5.2, "Use template instantiation instead as `TMulticastDelegate<void(bool)>`") = TMulticastDelegate<void(bool)>;
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/Misc/DataDrivenPlatformInfoRegistry.h:109
Scope: file
Source code excerpt:
FText MenuTooltip;
FText IconText;
FName DeviceProfileName;
};
#endif
// Information about a platform loaded from disk
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/DeviceProfiles/DeviceProfileManager.h:248
Scope (from outer to inner):
file
class class UDeviceProfileManager : public UObject
Source code excerpt:
* Walk the device profile/fragment chain to get the final set ot CVars in a unified way
*/
static ENGINE_API TMap<FName, FString> GatherDeviceProfileCVars(const FString& DeviceProfileName, EDeviceProfileMode GatherMode);
/**
* Gather all the cvars from the static device profile and then add all of the possible cvars+values from the dynamic/matched rule fragments.
*/
static ENGINE_API TMap<FName, TSet<FString>> GetAllReferencedDeviceProfileCVars(UDeviceProfile* DeviceProfile);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/DeviceProfiles/DeviceProfileManager.h:259
Scope: file
Source code excerpt:
* Set the active device profile - set via the device profile blueprint.
*
* @param DeviceProfileName - The profile name.
*/
ENGINE_API void SetActiveDeviceProfile( UDeviceProfile* DeviceProfile );
/**
* Override CVar value change callback
*/
ENGINE_API void HandleDeviceProfileOverrideChange();
/** Sees if two profiles are considered identical for saving */
ENGINE_API bool AreProfilesTheSame(UDeviceProfile* Profile1, UDeviceProfile* Profile2) const;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/DeviceProfiles/DeviceProfileManager.h:278
Scope (from outer to inner):
file
class class UDeviceProfileManager : public UObject
Source code excerpt:
* the Mode will control how the settings are handled
*/
static ENGINE_API void SetDeviceProfileCVars(const FString& DeviceProfileName);
/** Read and process all of the fragment matching rules. Returns an array containing the names of fragments selected. */
static ENGINE_API TArray<FSelectedFragmentProperties> FindMatchingFragments(const FString& ParentDP, class FConfigCacheIni* PreviewConfigSystem);
/** Read and discover all of the possible fragments referenced by the matching rules. Returns an array containing the names of fragments selected. */
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:162
Scope (from outer to inner):
file
function void FDumpFPSChartToEndpoint::HandleBasicStats
Source code excerpt:
PrintToEndpoint(FString::Printf(TEXT("\tOS: %s %s"), *OSMajor, *OSMinor));
PrintToEndpoint(FString::Printf(TEXT("\tCPU: %s %s"), *CPUVendor, *CPUBrand));
PrintToEndpoint(FString::Printf(TEXT("\tDeviceProfile: %s"), *DeviceProfileName));
FString CompositeGPUString = FString::Printf(TEXT("\tGPU: %s"), *ActualGPUBrand);
if (ActualGPUBrand != DesktopGPUBrand)
{
CompositeGPUString += FString::Printf(TEXT(" (desktop adapter %s)"), *DesktopGPUBrand);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:217
Scope (from outer to inner):
file
function void FDumpFPSChartToEndpoint::DumpChart
Source code excerpt:
int32 NumFrames = (int32)Chart.GetNumFrames();
MapName = MoveTemp(InMapName);
DeviceProfileName = MoveTemp(InDeviceProfileName);
if (TotalTime > WallClockTimeFromStartOfCharting)
{
UE_LOG(LogChartCreation, Log, TEXT("Weirdness: wall clock time (%f) is smaller than total frame time (%f)"), WallClockTimeFromStartOfCharting, TotalTime);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:369
Scope (from outer to inner):
file
function virtual void HandleBasicStats
Source code excerpt:
ParamArray.Add(FAnalyticsEventAttribute(TEXT("OS"), FString::Printf(TEXT("%s %s"), *OSMajor, *OSMinor)));
ParamArray.Add(FAnalyticsEventAttribute(TEXT("CPU"), FString::Printf(TEXT("%s %s"), *CPUVendor, *CPUBrand)));
ParamArray.Add(FAnalyticsEventAttribute(TEXT("DeviceProfile"), DeviceProfileName));
if (bIncludeClientHWInfo)
{
ParamArray.Add(FAnalyticsEventAttribute(TEXT("DesktopGPU"), DesktopGPUBrand)); //@TODO: Cut this one out entirely?
ParamArray.Add(FAnalyticsEventAttribute(TEXT("GPUAdapter"), ActualGPUBrand));
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:519
Scope (from outer to inner):
file
function virtual void HandleBasicStats
Source code excerpt:
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_BUILDCONFIG"), LexToString(FApp::GetBuildConfiguration()), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_DATESTAMP"), *FString::Printf(TEXT("%s"), *FDateTime::Now().ToString()), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_DEVICE_PROFILE"), *DeviceProfileName, ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_OS"), *FString::Printf(TEXT("%s %s"), *OSMajor, *OSMinor), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_CPU"), *FString::Printf(TEXT("%s %s"), *CPUVendor, *CPUBrand), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_GPU"), *FString::Printf(TEXT("%s"), *ActualGPUBrand), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_SETTINGS_RES"), *FString::Printf(TEXT("%.2f"), ScalabilityQuality.ResolutionQuality), ESearchCase::CaseSensitive);
FPSChartRow = FPSChartRow.Replace(TEXT("TOKEN_SETTINGS_VD"), *FString::Printf(TEXT("%d"), ScalabilityQuality.ViewDistanceQuality), ESearchCase::CaseSensitive);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:651
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::Reset
Source code excerpt:
StartBatteryLevel = -1;
StopBatteryLevel = -1;
DeviceProfileName = UDeviceProfileManager::Get().GetActiveDeviceProfileName();
bIsChartingPaused = false;
}
void FPerformanceTrackingChart::AccumulateWith(const FPerformanceTrackingChart& Chart)
{
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:726
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::StartCharting
Source code excerpt:
StartTemperatureLevel = FPlatformMisc::GetDeviceTemperatureLevel();
StartBatteryLevel = FPlatformMisc::GetBatteryLevel();
DeviceProfileName = UDeviceProfileManager::Get().GetActiveDeviceProfileName();
bIsChartingPaused = false;
}
void FPerformanceTrackingChart::StopCharting()
{
StopTemperatureLevel = FPlatformMisc::GetDeviceTemperatureLevel();
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:878
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::DumpChartsToOutputLog
Source code excerpt:
{
FDumpFPSChartToLogEndpoint Endpoint(*Chart);
Endpoint.DumpChart(WallClockElapsed, InMapName, DeviceProfileName);
}
}
#if ALLOW_DEBUG_FILES
void FPerformanceTrackingChart::DumpChartsToLogFile(double WallClockElapsed, const TArray<const FPerformanceTrackingChart*>& Charts, const FString& InMapName, const FString& LogFileName)
{
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:891
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::DumpChartsToLogFile
Source code excerpt:
{
FDumpFPSChartToFileEndpoint FileEndpoint(*pChart, OutputFile);
FileEndpoint.DumpChart(WallClockElapsed, InMapName, DeviceProfileName);
}
OutputFile->Logf(LINE_TERMINATOR LINE_TERMINATOR LINE_TERMINATOR);
// Flush, close and delete.
delete OutputFile;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:919
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::DumpChartToAnalyticsParams
Source code excerpt:
// Dump all the basic stats
FDumpFPSChartToAnalyticsArray AnalyticsEndpoint(*this, InParamArray, bIncludeClientHWInfo, bIncludeHistograms);
AnalyticsEndpoint.DumpChart(AccumulatedChartTime, InMapName, DeviceProfileName);
if (bIncludeClientHWInfo)
{
// Dump some extra non-chart-based stats
// Get the system memory stats
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ChartCreation.cpp:1799
Scope (from outer to inner):
file
function void FPerformanceTrackingChart::DumpChartsToHTML
Source code excerpt:
FString NewRow = FPSChartRowStructure;
FDumpFPSChartToHTMLEndpoint HTMLEndpoint(*Chart, /*inout*/ NewRow);
HTMLEndpoint.DumpChart(WallClockElapsed, InMapName, DeviceProfileName);
NewRows += NewRow;
}
// See whether file already exists and load it into string if it does.
FString FPSChart;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:96
Scope (from outer to inner):
file
function UDeviceProfileManager& UDeviceProfileManager::Get
lambda-function
Source code excerpt:
#if ALLOW_OTHER_PLATFORM_CONFIG
FCoreDelegates::GatherDeviceProfileCVars.BindLambda([](const FString& DeviceProfileName) { return UDeviceProfileManager::Get().GatherDeviceProfileCVars(DeviceProfileName, EDeviceProfileMode::DPM_CacheValues); });
#endif
// let any other code that needs the DPManager to run now
FDelayedAutoRegisterHelper::RunAndClearDelayedAutoRegisterDelegates(EDelayedRegisterRunPhase::DeviceProfileManagerReady);
}
return *DeviceProfileManagerSingleton;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:158
Scope (from outer to inner):
file
function TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars
Source code excerpt:
}
TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars(const FString& DeviceProfileName, EDeviceProfileMode GatherMode)
{
FConfigCacheIni* ConfigSystem = GConfig;
// build up cvars into a map
TMap<FName, FString> DeviceProfileCVars;
TArray<FSelectedFragmentProperties> FragmentsSelected;
TSet<FString> FragmentCVarKeys;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:174
Scope (from outer to inner):
file
function TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars
Source code excerpt:
#if ALLOW_OTHER_PLATFORM_CONFIG
// caching is not done super early, so we can assume DPs have been found now
UDeviceProfile* Profile = UDeviceProfileManager::Get().FindProfile(DeviceProfileName, true);
if (Profile == nullptr)
{
UE_LOG(LogDeviceProfileManager, Log, TEXT("Unable to find DeviceProfile '%s' for gathering cvars for caching. Aborting...."), *DeviceProfileName);
check(Profile);
return DeviceProfileCVars;
}
// use the DP's platform's configs, NOT the running platform
ConfigSystem = FConfigCacheIni::ForPlatform(*Profile->DeviceType);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:188
Scope (from outer to inner):
file
function TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars
Source code excerpt:
if(GatherMode == EDeviceProfileMode::DPM_CacheValues)
{
FragmentsSelected = FindMatchingFragments(DeviceProfileName, ConfigSystem);
}
#else
checkNoEntry();
#endif
}
else
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:199
Scope (from outer to inner):
file
function TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars
Source code excerpt:
if (PlatformFragmentsSelected.Num() == 0)
{
PlatformFragmentsSelected = FindMatchingFragments(DeviceProfileName, GConfig);
if(PlatformFragmentsSelected.Num())
{
// Store the fragment string:
FString MatchedFragmentString = FragmentPropertyArrayToFragmentString(PlatformFragmentsSelected, false, false, true);
FGenericCrashContext::SetEngineData(TEXT("DeviceProfile.MatchedFragmentsSorted"), MatchedFragmentString);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:244
Scope (from outer to inner):
file
function TMap<FName, FString> UDeviceProfileManager::GatherDeviceProfileCVars
Source code excerpt:
// For each device profile, starting with the selected and working our way up the BaseProfileName tree,
FString BaseDeviceProfileName = DeviceProfileName;
bool bReachedEndOfTree = BaseDeviceProfileName.IsEmpty();
while (bReachedEndOfTree == false)
{
FString CurrentSectionName = BaseDeviceProfileName + SectionSuffix;
// check if there is a section named for the DeviceProfile
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:396
Scope (from outer to inner):
file
function void UDeviceProfileManager::SetDeviceProfileCVars
Source code excerpt:
}
void UDeviceProfileManager::SetDeviceProfileCVars(const FString& DeviceProfileName)
{
// walk over the parent chain, gathering the cvars this DP inherits and contains
TMap<FName, FString> DeviceProfileCVars = GatherDeviceProfileCVars(DeviceProfileName, EDeviceProfileMode::DPM_SetCVars);
// reset some global state
DeviceProfileScalabilityCVars.Empty();
// we should have always popped away old values by the time we get here
check(PushedSettings.Num() == 0);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ChartCreation.h:223
Scope (from outer to inner):
file
class class FPerformanceTrackingChart : public IPerformanceDataConsumer
Source code excerpt:
/** WARNING: This value could technically change while data collection is ongoing. Hanlding such changes is not handled by this code. */
FString DeviceProfileName;
bool bIsChartingPaused;
// memory stats
uint32 NumFramesAtCriticalMemoryPressure;
uint64 MaxPhysicalMemory;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ChartCreation.h:454
Scope: file
Source code excerpt:
double WallClockTimeFromStartOfCharting; // This can be much larger than TotalTime if the chart was paused or long frames were omitted
FString MapName;
FString DeviceProfileName;
float AvgGPUFrameTime;
float AvgRenderThreadFrameTime;
float AvgGameThreadFrameTime;
double TotalFlushAsyncLoadingTimeInMS;
#Loc: <Workspace>/Projects/Lyra/Source/LyraGame/Hotfix/LyraHotfixManager.cpp:100
Scope (from outer to inner):
file
function bool ULyraHotfixManager::HotfixIniFile
Source code excerpt:
for (const auto& DPSection : AsConst(DeviceProfileHotfixConfig))
{
FString DeviceProfileName, DeviceProfileClass;
if (DPSection.Key.Split(TEXT(" "), &DeviceProfileName, &DeviceProfileClass) && DeviceProfileClass == *UDeviceProfile::StaticClass()->GetName())
{
Keys.Add(DeviceProfileName);
}
}
// Check if any of the hotfixed device profiles are referenced by the currently active profile(s):
bHasPendingDeviceProfileHotfix = UDeviceProfileManager::Get().DoActiveProfilesReference(Keys);
UE_LOG(LogHotfixManager, Log, TEXT("Active device profile was referenced by hotfix = %d"), (uint32)bHasPendingDeviceProfileHotfix);