sg.ViewDistanceQuality
sg.ViewDistanceQuality
#Overview
name: sg.ViewDistanceQuality
The value of this variable can be defined or overridden in .ini config files. 14
.ini config files referencing this setting variable.
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3
It is referenced in 11
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of sg.ViewDistanceQuality is to control the quality level of view distance in Unreal Engine’s scalability system. This setting affects how far objects are rendered in the game world, impacting performance and visual fidelity.
This variable is primarily used by the Unreal Engine’s scalability system, which is part of the Engine module. It’s also referenced in the MovieRenderPipeline plugin and the LyraGame project, indicating its widespread use across different parts of the engine and game projects.
The value of this variable is set through various means:
- It can be set via configuration files (INI files).
- It can be modified through console commands.
- It can be adjusted programmatically, such as in the MovieRenderPipeline when overriding game settings.
The variable interacts closely with other scalability settings like AntiAliasingQuality, ShadowQuality, etc. They are often set together to achieve a consistent level of visual quality and performance.
Developers should be aware that:
- This variable uses a quality scale from 0 to 4 (low, medium, high, epic, cinematic).
- Changes to this variable can significantly impact performance and visual quality.
- It’s part of the broader scalability system and should be considered alongside other quality settings.
Best practices when using this variable include:
- Test thoroughly at different quality levels to ensure a good balance between performance and visual quality.
- Consider platform-specific defaults, as mobile devices may require lower settings than high-end PCs.
- Allow players to adjust this setting if possible, as view distance can greatly affect gameplay in some genres.
Regarding the associated variable CVarViewDistanceQuality: This is the actual console variable that controls the view distance quality. It’s created as a TAutoConsoleVariable and is the internal representation of sg.ViewDistanceQuality.
CVarViewDistanceQuality is used to:
- Set callbacks when the value changes (OnChangeViewDistanceQuality).
- Directly get or set the current value in C++ code.
- Interface with the broader scalability system.
When working with view distance quality, developers can interact with either sg.ViewDistanceQuality (typically through console commands or INI files) or CVarViewDistanceQuality (in C++ code) depending on the context and needs of their implementation.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseDeviceProfiles.ini:309, section: [IOS DeviceProfile]
- INI Section:
IOS DeviceProfile
- Raw value:
3
- Is Array:
False
Location: <Workspace>/Engine/Config/BaseDeviceProfiles.ini:829, section: [Android_Low DeviceProfile]
- INI Section:
Android_Low DeviceProfile
- Raw value:
0
- Is Array:
False
Location: <Workspace>/Engine/Config/BaseDeviceProfiles.ini:844, section: [Android_Mid DeviceProfile]
- INI Section:
Android_Mid DeviceProfile
- Raw value:
1
- Is Array:
False
Location: <Workspace>/Engine/Config/BaseDeviceProfiles.ini:858, section: [Android_High DeviceProfile]
- INI Section:
Android_High DeviceProfile
- Raw value:
2
- Is Array:
False
Location: <Workspace>/Engine/Config/BaseDeviceProfiles.ini:883, section: [Android_Vulkan_SM5 DeviceProfile]
- INI Section:
Android_Vulkan_SM5 DeviceProfile
- Raw value:
2
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:41, section: [Mobile DeviceProfile]
- INI Section:
Mobile DeviceProfile
- Raw value:
0
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:88, section: [IOS_Low DeviceProfile]
- INI Section:
IOS_Low DeviceProfile
- Raw value:
0
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:101, section: [IOS_Mid DeviceProfile]
- INI Section:
IOS_Mid DeviceProfile
- Raw value:
1
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:128, section: [IOS_High DeviceProfile]
- INI Section:
IOS_High DeviceProfile
- Raw value:
2
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:145, section: [IOS_Epic DeviceProfile]
- INI Section:
IOS_Epic DeviceProfile
- Raw value:
3
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:501, section: [Android_Low DeviceProfile]
- INI Section:
Android_Low DeviceProfile
- Raw value:
0
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:514, section: [Android_Mid DeviceProfile]
- INI Section:
Android_Mid DeviceProfile
- Raw value:
1
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:541, section: [Android_High DeviceProfile]
- INI Section:
Android_High DeviceProfile
- Raw value:
2
- Is Array:
False
Location: <Workspace>/Projects/Lyra/Config/DefaultDeviceProfiles.ini:557, section: [Android_Epic DeviceProfile]
- INI Section:
Android_Epic DeviceProfile
- Raw value:
3
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:38
Scope: file
Source code excerpt:
static TAutoConsoleVariable<int32> CVarViewDistanceQuality(
TEXT("sg.ViewDistanceQuality"),
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
ECVF_ScalabilityGroup | ECVF_Preview);
static TAutoConsoleVariable<int32> CVarAntiAliasingQuality(
#Loc: <Workspace>/Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Private/Graph/Nodes/MovieGraphGlobalGameOverrides.cpp:30
Scope (from outer to inner):
file
function void UMovieGraphGlobalGameOverridesNode::BuildNewProcessCommandLineArgsImpl
Source code excerpt:
QualityLevels.SetFromSingleQualityLevel(static_cast<int32>(ScalabilityQualityLevel));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.ViewDistanceQuality={0}"), {QualityLevels.ViewDistanceQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.AntiAliasingQuality={0}"), {QualityLevels.AntiAliasingQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.ShadowQuality={0}"), {QualityLevels.ShadowQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.GlobalIlluminationQuality={0}"), {QualityLevels.GlobalIlluminationQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.ReflectionQuality={0}"), {QualityLevels.ReflectionQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.PostProcessQuality={0}"), {QualityLevels.PostProcessQuality}));
InOutDeviceProfileCvars.Add(FString::Format(TEXT("sg.TextureQuality={0}"), {QualityLevels.TextureQuality}));
#Loc: <Workspace>/Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Private/MoviePipelineGameOverrideSetting.cpp:162
Scope (from outer to inner):
file
function void UMoviePipelineGameOverrideSetting::BuildNewProcessCommandLineArgsImpl
Source code excerpt:
if (bCinematicQualitySettings)
{
InOutDeviceProfileCvars.Add(TEXT("sg.ViewDistanceQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.AntiAliasingQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.ShadowQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.GlobalIlluminationQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.ReflectionQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.PostProcessQuality=4"));
InOutDeviceProfileCvars.Add(TEXT("sg.TextureQuality=4"));
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/DeviceProfiles/DeviceProfileManager.cpp:141
Scope (from outer to inner):
file
function static void ExpandScalabilityCVar
Source code excerpt:
{
// load scalability settings directly from ini instead of using scalability system, so as not to inadvertantly mess anything up
// if the DP had sg.ViewDistanceQuality=3, we would read [ViewDistanceQuality@3]
FString SectionName = FString::Printf(TEXT("%s@%s"), *CVarKey.Mid(3), *CVarValue);
// walk over the scalability section and add them in, unless already done
const FConfigSection* ScalabilitySection = ConfigSystem->GetSection(*SectionName, false, GScalabilityIni);
if (ScalabilitySection != nullptr)
{
for (const auto& Pair : *ScalabilitySection)
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:1128
Scope (from outer to inner):
file
namespace Scalability
function void LoadState
Source code excerpt:
// looks like cvars but here we just use the name for the ini
GConfig->GetFloat(Section, TEXT("sg.ResolutionQuality"), State.ResolutionQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.ViewDistanceQuality"), State.ViewDistanceQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.AntiAliasingQuality"), State.AntiAliasingQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.ShadowQuality"), State.ShadowQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.GlobalIlluminationQuality"), State.GlobalIlluminationQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.ReflectionQuality"), State.ReflectionQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.PostProcessQuality"), State.PostProcessQuality, IniName);
GConfig->GetInt(Section, TEXT("sg.TextureQuality"), State.TextureQuality, IniName);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:1162
Scope (from outer to inner):
file
namespace Scalability
function void SaveState
Source code excerpt:
// looks like cvars but here we just use the name for the ini
GConfig->SetFloat(Section, TEXT("sg.ResolutionQuality"), State.ResolutionQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.ViewDistanceQuality"), State.ViewDistanceQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.AntiAliasingQuality"), State.AntiAliasingQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.ShadowQuality"), State.ShadowQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.GlobalIlluminationQuality"), State.GlobalIlluminationQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.ReflectionQuality"), State.ReflectionQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.PostProcessQuality"), State.PostProcessQuality, IniName);
GConfig->SetInt(Section, TEXT("sg.TextureQuality"), State.TextureQuality, IniName);
#Loc: <Workspace>/Projects/Lyra/Source/LyraGame/Settings/LyraSettingsLocal.cpp:268
Scope (from outer to inner):
file
namespace LyraSettingsHelpers
function void FillScalabilitySettingsFromDeviceProfile
Source code excerpt:
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.ResolutionQuality%s"), *Suffix), Mode.Qualities.ResolutionQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.ViewDistanceQuality%s"), *Suffix), Mode.Qualities.ViewDistanceQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.AntiAliasingQuality%s"), *Suffix), Mode.Qualities.AntiAliasingQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.ShadowQuality%s"), *Suffix), Mode.Qualities.ShadowQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.GlobalIlluminationQuality%s"), *Suffix), Mode.Qualities.GlobalIlluminationQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.ReflectionQuality%s"), *Suffix), Mode.Qualities.ReflectionQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.PostProcessQuality%s"), *Suffix), Mode.Qualities.PostProcessQuality);
Mode.bHasOverrides |= UDeviceProfileManager::GetScalabilityCVar(FString::Printf(TEXT("sg.TextureQuality%s"), *Suffix), Mode.Qualities.TextureQuality);
#Associated Variable and Callsites
This variable is associated with another variable named CVarViewDistanceQuality
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:37
Scope: file
Source code excerpt:
ECVF_Scalability);
static TAutoConsoleVariable<int32> CVarViewDistanceQuality(
TEXT("sg.ViewDistanceQuality"),
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
ECVF_ScalabilityGroup | ECVF_Preview);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:585
Scope (from outer to inner):
file
namespace Scalability
function void InitScalabilitySystem
Source code excerpt:
CVarResolutionQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeResolutionQuality));
CVarViewDistanceQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeViewDistanceQuality));
CVarAntiAliasingQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeAntiAliasingQuality));
CVarShadowQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeShadowQuality));
CVarGlobalIlluminationQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeGlobalIlluminationQuality));
CVarReflectionQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeReflectionQuality));
CVarPostProcessQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangePostProcessQuality));
CVarTextureQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeTextureQuality));
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:887
Scope (from outer to inner):
file
namespace Scalability
function void SetQualityLevels
Source code excerpt:
{
SetQualityLevelCVar(CVarResolutionQuality, ClampedLevels.ResolutionQuality, GScalabilityQualityLevelsOverride.ResolutionQuality, bForce);
SetQualityLevelCVar(CVarViewDistanceQuality, ClampedLevels.ViewDistanceQuality, GScalabilityQualityLevelsOverride.ViewDistanceQuality, bForce);
SetQualityLevelCVar(CVarAntiAliasingQuality, ClampedLevels.AntiAliasingQuality, GScalabilityQualityLevelsOverride.AntiAliasingQuality, bForce);
SetQualityLevelCVar(CVarShadowQuality, ClampedLevels.ShadowQuality, GScalabilityQualityLevelsOverride.ShadowQuality, bForce);
SetQualityLevelCVar(CVarGlobalIlluminationQuality, ClampedLevels.GlobalIlluminationQuality, GScalabilityQualityLevelsOverride.GlobalIlluminationQuality, bForce);
SetQualityLevelCVar(CVarReflectionQuality, ClampedLevels.ReflectionQuality, GScalabilityQualityLevelsOverride.ReflectionQuality, bForce);
SetQualityLevelCVar(CVarPostProcessQuality, ClampedLevels.PostProcessQuality, GScalabilityQualityLevelsOverride.PostProcessQuality, bForce);
SetQualityLevelCVar(CVarTextureQuality, ClampedLevels.TextureQuality, GScalabilityQualityLevelsOverride.TextureQuality, bForce);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:919
Scope (from outer to inner):
file
namespace Scalability
function FQualityLevels GetQualityLevels
Source code excerpt:
{
Ret.ResolutionQuality = CVarResolutionQuality.GetValueOnGameThread();
Ret.ViewDistanceQuality = CVarViewDistanceQuality.GetValueOnGameThread();
Ret.AntiAliasingQuality = CVarAntiAliasingQuality.GetValueOnGameThread();
Ret.ShadowQuality = CVarShadowQuality.GetValueOnGameThread();
Ret.GlobalIlluminationQuality = CVarGlobalIlluminationQuality.GetValueOnGameThread();
Ret.ReflectionQuality = CVarReflectionQuality.GetValueOnGameThread();
Ret.PostProcessQuality = CVarPostProcessQuality.GetValueOnGameThread();
Ret.TextureQuality = CVarTextureQuality.GetValueOnGameThread();