au.AudioGameplayVolume.UpdateRate
au.AudioGameplayVolume.UpdateRate
#Overview
name: au.AudioGameplayVolume.UpdateRate
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
How frequently we check for listener changes with respect to audio gameplay volumes, in seconds.
It is referenced in 26
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of au.AudioGameplayVolume.UpdateRate is to control how frequently the Audio Gameplay Volume system checks for listener changes with respect to audio gameplay volumes. This setting is part of the Audio Gameplay Volume plugin in Unreal Engine 5.
The Audio Gameplay Volume subsystem relies on this setting variable. It’s used in the UAudioGameplayVolumeSubsystem class to determine the update frequency for the system.
The value of this variable is set using an FAutoConsoleVariableRef, which means it can be adjusted through console commands or configuration files. The default value is 0.05 seconds (50 milliseconds).
This variable interacts with other variables in the system:
- MinUpdateRate: Ensures the update rate doesn’t go below a certain threshold (0.016 seconds).
- UpdateRateJitterDelta: Adds a random jitter to the update rate to prevent synchronization issues.
Developers should be aware of the following when using this variable:
- Lower values will increase responsiveness but may impact performance.
- Higher values will decrease responsiveness but may improve performance.
- The actual update rate includes a random jitter, so it’s not strictly fixed.
Best practices when using this variable include:
- Balance between responsiveness and performance based on your game’s needs.
- Consider the minimum update rate (MinUpdateRate) when adjusting this value.
- Be aware of the jitter effect when fine-tuning the system’s behavior.
Regarding the associated variable UpdateRate: The purpose of UpdateRate is to control how frequently various systems in Unreal Engine update their data or perform certain operations. It’s used in multiple contexts, including animation, UI updates, and audio processing.
This variable is used across different subsystems and plugins, including:
- Live Link Curve Debug UI
- Timecode Synchronizer
- Common UI
- Audio Mixer
- Animation System
The value of UpdateRate is typically set within the specific system that uses it, often as a parameter in a constructor or initialization function.
Developers should be aware that:
- UpdateRate affects the trade-off between responsiveness and performance in various systems.
- Different systems may have different optimal update rates.
- Some systems may have minimum or maximum limits for the update rate.
Best practices for using UpdateRate include:
- Adjust the value based on the specific needs of each system.
- Consider the performance implications of very high update rates.
- For time-sensitive operations, ensure the update rate is sufficient to meet responsiveness requirements.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Plugins/AudioGameplayVolume/Source/AudioGameplayVolume/Private/AudioGameplayVolumeSubsystem.cpp:32
Scope (from outer to inner):
file
namespace AudioGameplayVolumeConsoleVariables
Source code excerpt:
float UpdateRate = 0.05f;
FAutoConsoleVariableRef CVarUpdateInterval(
TEXT("au.AudioGameplayVolume.UpdateRate"),
UpdateRate,
TEXT("How frequently we check for listener changes with respect to audio gameplay volumes, in seconds."),
ECVF_Default);
float UpdateRateJitterDelta = 0.025f;
FAutoConsoleVariableRef CVarUpdateRateJitterDelta(
#Associated Variable and Callsites
This variable is associated with another variable named UpdateRate
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Plugins/Animation/LiveLinkCurveDebugUI/Source/LiveLinkCurveDebugUI/Private/SLiveLinkCurveDebugUI.cpp:21
Scope (from outer to inner):
file
function void SLiveLinkCurveDebugUI::Construct
Source code excerpt:
void SLiveLinkCurveDebugUI::Construct(const FArguments& InArgs)
{
this->UpdateRate = InArgs._UpdateRate;
this->OnSubjectNameChanged = InArgs._OnSubjectNameChanged;
CachedLiveLinkSubjectName = InArgs._InitialLiveLinkSubjectName;
//Try and get the LiveLink Client now and cache it off
CachedLiveLinkClient = nullptr;
#Loc: <Workspace>/Engine/Plugins/Animation/LiveLinkCurveDebugUI/Source/LiveLinkCurveDebugUI/Private/SLiveLinkCurveDebugUI.cpp:88
Scope (from outer to inner):
file
function void SLiveLinkCurveDebugUI::Construct
Source code excerpt:
//Kick off initial CurveData generation
UpdateCurveData();
NextUpdateTime = static_cast<double>(UpdateRate) + FSlateApplication::Get().GetCurrentTime();
}
TSharedRef<ITableRow> SLiveLinkCurveDebugUI::GenerateListRow(TSharedPtr<FLiveLinkDebugCurveNodeBase> InItem, const TSharedRef<STableViewBase>& InOwningTable)
{
return SNew(SLiveLinkCurveDebugUIListItem, InOwningTable)
.CurveInfo(InItem);
#Loc: <Workspace>/Engine/Plugins/Animation/LiveLinkCurveDebugUI/Source/LiveLinkCurveDebugUI/Private/SLiveLinkCurveDebugUI.cpp:105
Scope (from outer to inner):
file
function void SLiveLinkCurveDebugUI::Tick
Source code excerpt:
{
UpdateCurveData();
NextUpdateTime = static_cast<double>(UpdateRate) + CurrentTime;
DebugListView->RequestListRefresh();
}
}
SUserWidget::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
#Loc: <Workspace>/Engine/Plugins/Animation/LiveLinkCurveDebugUI/Source/LiveLinkCurveDebugUI/Public/SLiveLinkCurveDebugUI.h:65
Scope (from outer to inner):
file
class class SLiveLinkCurveDebugUI : public SUserWidget
Source code excerpt:
//Used to limit how often we update curve data for performance
float UpdateRate;
double NextQueuedUpdateTime;
double NextUpdateTime;
TSharedPtr<SListView<TSharedPtr<FLiveLinkDebugCurveNodeBase>>> DebugListView;
};
#Loc: <Workspace>/Engine/Plugins/AudioGameplayVolume/Source/AudioGameplayVolume/Private/AudioGameplayVolumeSubsystem.cpp:30
Scope (from outer to inner):
file
namespace AudioGameplayVolumeConsoleVariables
Source code excerpt:
float MinUpdateRate = 0.016f;
float UpdateRate = 0.05f;
FAutoConsoleVariableRef CVarUpdateInterval(
TEXT("au.AudioGameplayVolume.UpdateRate"),
UpdateRate,
TEXT("How frequently we check for listener changes with respect to audio gameplay volumes, in seconds."),
ECVF_Default);
float UpdateRateJitterDelta = 0.025f;
FAutoConsoleVariableRef CVarUpdateRateJitterDelta(
TEXT("au.AudioGameplayVolume.UpdateRate.JitterDelta"),
#Loc: <Workspace>/Engine/Plugins/AudioGameplayVolume/Source/AudioGameplayVolume/Private/AudioGameplayVolumeSubsystem.cpp:192
Scope (from outer to inner):
file
function void UAudioGameplayVolumeSubsystem::Update
Source code excerpt:
const float JitterDelta = FMath::RandRange(0.f, AudioGameplayVolumeConsoleVariables::UpdateRateJitterDelta);
NextUpdateDeltaTime = FMath::Max(AudioGameplayVolumeConsoleVariables::UpdateRate + JitterDelta, AudioGameplayVolumeConsoleVariables::MinUpdateRate);
TimeSinceUpdate = 0.f;
if (bHasStaleProxy)
{
FAudioDeviceHandle AudioDeviceHandle = GetAudioDeviceHandle();
if (AudioDeviceHandle.IsValid())
#Loc: <Workspace>/Engine/Plugins/Media/TimecodeSynchronizer/Source/TimecodeSynchronizerEditor/Private/Widgets/STimecodeSynchronizerWidget.cpp:60
Scope (from outer to inner):
file
function void STimecodeSynchronizerBarWidget::Tick
Source code excerpt:
void STimecodeSynchronizerBarWidget::Tick(const FGeometry& InAllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
if ((GFrameNumber % UpdateRate.Get()) == 0)
{
CurrentFrameWidth = FrameWidth.Get();
int32 SourceCount = TimecodeSynchronizer->GetSynchronizedSources().Num();
if (SourceCount)
{
#Loc: <Workspace>/Engine/Plugins/Media/TimecodeSynchronizer/Source/TimecodeSynchronizerEditor/Private/Widgets/STimecodeSynchronizerWidget.cpp:308
Scope (from outer to inner):
file
function void STimecodeSynchronizerBarWidget::Construct
Source code excerpt:
void STimecodeSynchronizerBarWidget::Construct(const FArguments& InArgs, UTimecodeSynchronizer& InTimecodeSynchronizer)
{
UpdateRate = InArgs._UpdateRate;
FrameWidth = InArgs._FrameWidth;
TimecodeSynchronizer.Reset(&InTimecodeSynchronizer);
SetCanTick(true);
}
void STimecodeSynchronizerBarWidget::SetUpdateRate(int32 InUpdateFrequency)
{
UpdateRate.Set(InUpdateFrequency);
}
void STimecodeSynchronizerBarWidget::SetFrameWidth(int32 InFrameWidth)
{
FrameWidth.Set(InFrameWidth);
}
#Loc: <Workspace>/Engine/Plugins/Media/TimecodeSynchronizer/Source/TimecodeSynchronizerEditor/Private/Widgets/STimecodeSynchronizerWidget.h:50
Scope (from outer to inner):
file
class class STimecodeSynchronizerBarWidget : public SWidget
Source code excerpt:
private:
TAttribute<int32> UpdateRate;
TAttribute<int32> FrameWidth;
int32 CurrentFrameWidth;
FFrameRate CurrentFrameRate;
int32 CurrentFrameValue;
int32 CurrentFrame;
#Loc: <Workspace>/Engine/Plugins/Runtime/CommonUI/Source/CommonUI/Private/CommonNumericTextBlock.cpp:102
Scope (from outer to inner):
file
function void UCommonNumericTextBlock::OnTimerTick
Source code excerpt:
static const float MinimumUpdateInterval = 0.05f;
const float UpdateRate = FMath::Max(InterpolationUpdateInterval, MinimumUpdateInterval);
if (DeltaSeconds > UpdateRate)
{
// Leverage actual tick as time-delta-based workhorse function.
Tick(DeltaSeconds);
// Update tick time so future calls to TimerTick behave properly.
LastTimerTickTime = CurrentTickTime;
#Loc: <Workspace>/Engine/Source/Runtime/AudioMixer/Private/AudioMixerSubmix.cpp:2211
Scope (from outer to inner):
file
namespace Audio
function void FMixerSubmix::AddSpectralAnalysisDelegate
Source code excerpt:
NewDelegateInfo.LastUpdateTime = -1.0f;
NewDelegateInfo.DelegateSettings = InDelegateSettings;
NewDelegateInfo.DelegateSettings.UpdateRate = FMath::Clamp(NewDelegateInfo.DelegateSettings.UpdateRate, 1.0f, 30.0f);
NewDelegateInfo.UpdateDelta = 1.0f / NewDelegateInfo.DelegateSettings.UpdateRate;
NewDelegateInfo.OnSubmixSpectralAnalysis.AddUnique(OnSubmixSpectralAnalysisBP);
{
FScopeLock SpectrumAnalyzerLock(&SpectrumAnalyzerCriticalSection);
#Loc: <Workspace>/Engine/Source/Runtime/AudioMixer/Private/AudioMixerSubmix.cpp:2293
Scope (from outer to inner):
file
namespace Audio
function void FMixerSubmix::StartSpectrumAnalysis
Source code excerpt:
FInlineEnvelopeFollowerInitParams EnvelopeFollowerInitParams;
EnvelopeFollowerInitParams.SampleRate = DelegateInfo.DelegateSettings.UpdateRate;
EnvelopeFollowerInitParams.AttackTimeMsec = static_cast<float>(BandSettings.AttackTimeMsec);
EnvelopeFollowerInitParams.ReleaseTimeMsec = static_cast<float>(BandSettings.ReleaseTimeMsec);
NewBand.EnvelopeFollower.Init(EnvelopeFollowerInitParams);
DelegateInfo.SpectralBands.Add(NewBand);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Engine/EngineTypes.h:2393
Scope: file
Source code excerpt:
/** How often animation will be updated/ticked. 1 = every frame, 2 = every 2 frames, etc. */
UPROPERTY()
int32 UpdateRate;
/** How often animation will be evaluated. 1 = every frame, 2 = every 2 frames, etc.
* has to be a multiple of UpdateRate. */
UPROPERTY()
int32 EvaluationRate;
/** Track time we have lost via skipping */
UPROPERTY(Transient)
float TickedPoseOffestTime;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Engine/EngineTypes.h:2461
Scope (from outer to inner):
file
function FAnimUpdateRateParameters
Source code excerpt:
, bSkipUpdate(false)
, bSkipEvaluation(false)
, UpdateRate(1)
, EvaluationRate(1)
, TickedPoseOffestTime(0.f)
, AdditionalTime(0.f)
, ThisTickDelta(0.f)
, BaseNonRenderedUpdateRate(4)
, MaxEvalRateForInterpolation(4)
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Engine/EngineTypes.h:2532
Scope (from outer to inner):
file
function FColor GetUpdateRateDebugColor
Source code excerpt:
if (OptimizeMode == TrailMode)
{
switch (UpdateRate)
{
case 1: return FColor::Red;
case 2: return FColor::Green;
case 3: return FColor::Blue;
}
return FColor::Black;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Sound/SoundSubmix.h:128
Scope: file
Source code excerpt:
// Number of times a second the delegate is triggered.
float UpdateRate;
// The decibel level considered silence.
float DecibelNoiseFloor;
// If true, returned values are scaled between 0 and 1.
bool bDoNormalize;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Sound/SoundSubmix.h:414
Scope (from outer to inner):
file
class class USoundSubmix : public USoundSubmixWithParentBase
Source code excerpt:
* @param InBandsettings The frequency bands to analyze and their envelope-following settings.
* @param OnSubmixSpectralAnalysisBP Event to fire when new spectral data is available.
* @param UpdateRate How often to retrieve the data from the spectral analyzer and broadcast the event. Max is 30 times per second.
* @param InterpMethod Method to used for band peak calculation.
* @param SpectrumType Metric to use when returning spectrum values.
* @param DecibelNoiseFloor Decibel Noise Floor to consider as silence when using a Decibel Spectrum Type.
* @param bDoNormalize If true, output band values will be normalized between zero and one.
* @param bDoAutoRange If true, output band values will have their ranges automatically adjusted to the minimum and maximum values in the audio. Output band values will be normalized between zero and one.
* @param AutoRangeAttackTime The time (in seconds) it takes for the range to expand to 90% of a larger range.
* @param AutoRangeReleaseTime The time (in seconds) it takes for the range to shrink to 90% of a smaller range.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|Spectrum", meta = (WorldContext = "WorldContextObject", AdvancedDisplay = 3))
ENGINE_API void AddSpectralAnalysisDelegate(const UObject* WorldContextObject, const TArray<FSoundSubmixSpectralAnalysisBandSettings>& InBandSettings, const FOnSubmixSpectralAnalysisBP& OnSubmixSpectralAnalysisBP, float UpdateRate = 10.f, float DecibelNoiseFloor=-40.f, bool bDoNormalize = true, bool bDoAutoRange = false, float AutoRangeAttackTime = 0.1f, float AutoRangeReleaseTime = 60.f);
/**
* Remove a spectral analysis delegate.
* @param OnSubmixSpectralAnalysisBP The event delegate to remove.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|Spectrum", meta = (WorldContext = "WorldContextObject"))
ENGINE_API void RemoveSpectralAnalysisDelegate(const UObject* WorldContextObject, const FOnSubmixSpectralAnalysisBP& OnSubmixSpectralAnalysisBP);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Sound/SoundSubmix.h:459
Scope (from outer to inner):
file
class class USoundSubmix : public USoundSubmixWithParentBase
Source code excerpt:
static ENGINE_API FSoundSpectrumAnalyzerSettings GetSpectrumAnalyzerSettings(EFFTSize FFTSize, EFFTPeakInterpolationMethod InterpolationMethod, EFFTWindowType WindowType, float HopSize, EAudioSpectrumType SpectrumType);
static ENGINE_API FSoundSpectrumAnalyzerDelegateSettings GetSpectrumAnalysisDelegateSettings(const TArray<FSoundSubmixSpectralAnalysisBandSettings>& InBandSettings, float UpdateRate, float DecibelNoiseFloor, bool bDoNormalize, bool bDoAutoRange, float AutoRangeAttackTime, float AutoRangeReleaseTime);
protected:
ENGINE_API virtual void Serialize(FArchive& Ar) override;
ENGINE_API virtual void PostLoad() override;
#if WITH_EDITOR
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Animation/AnimInstance.cpp:1034
Scope (from outer to inner):
file
function void UAnimInstance::DisplayDebugInstance
Source code excerpt:
{
DebugText = FString::Printf(TEXT("URO Rate(%d) SkipUpdate(%d) SkipEval(%d) Interp(%d)"),
UROParams->UpdateRate, UROParams->ShouldSkipUpdate(), UROParams->ShouldSkipEvaluation(),
UROParams->ShouldInterpolateSkippedFrames());
DisplayDebugManager.DrawString(DebugText, Indent);
}
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Animation/AnimInstanceProxy.cpp:765
Scope (from outer to inner):
file
function void FAnimInstanceProxy::InitializeObjects
Source code excerpt:
if(bDoUro)
{
NumUroSkippedFrames_Update = RateParams->UpdateRate - 1;
const bool bDoEvalOptimization = RateParams->DoEvaluationRateOptimizations();
if(bDoEvalOptimization)
{
NumUroSkippedFrames_Eval = RateParams->EvaluationRate - 1;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Components/SkinnedMeshComponent.cpp:1382
Scope (from outer to inner):
file
function void USkinnedMeshComponent::TickUpdateRate
Source code excerpt:
FString DebugString = FString::Printf(TEXT("%s UpdateRate(%d) EvaluationRate(%d) ShouldInterpolateSkippedFrames(%d) ShouldSkipUpdate(%d) Interp Alpha (%f) AdditionalTime(%f)"),
*GetNameSafe(GetSkinnedAsset()), AnimUpdateRateParams->UpdateRate, AnimUpdateRateParams->EvaluationRate,
AnimUpdateRateParams->ShouldInterpolateSkippedFrames(), AnimUpdateRateParams->ShouldSkipUpdate(), AnimUpdateRateParams->GetInterpolationAlpha(), AnimUpdateRateParams->AdditionalTime);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 0.f, FColor::Red, DebugString, false);
}
#endif // ENABLE_DRAW_DEBUG
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Components/SkinnedMeshComponent.cpp:5085
Scope (from outer to inner):
file
function void FAnimUpdateRateParameters::SetTrailMode
Source code excerpt:
ThisTickDelta = DeltaTime;
UpdateRate = FMath::Max(NewUpdateRate, 1);
// Make sure EvaluationRate is a multiple of UpdateRate.
EvaluationRate = FMath::Max((NewEvaluationRate / UpdateRate) * UpdateRate, 1);
bInterpolateSkippedFrames = (FAnimUpdateRateManager::CVarURODisableInterpolation.GetValueOnAnyThread() == 0) &&
((bNewInterpSkippedFrames && (EvaluationRate < MaxEvalRateForInterpolation)) || (FAnimUpdateRateManager::CVarForceInterpolation.GetValueOnAnyThread() == 1));
// Make sure we don't overflow. we don't need very large numbers.
const uint32 Counter = (GFrameCounter + UpdateRateShift) % MAX_uint32;
bSkipUpdate = ((Counter % UpdateRate) > 0);
bSkipEvaluation = ((Counter % EvaluationRate) > 0);
// As UpdateRate changes, because of LODs for example,
// make sure we're not caught in a loop where we don't update longer than our update rate.
{
SkippedUpdateFrames = bSkipUpdate ? ++SkippedUpdateFrames : 0;
SkippedEvalFrames = bSkipEvaluation ? ++SkippedEvalFrames : 0;
// If we've gone longer that our UpdateRate, force an update to happen.
if ((SkippedUpdateFrames >= UpdateRate) || (SkippedEvalFrames >= EvaluationRate))
{
bSkipUpdate = false;
bSkipEvaluation = false;
SkippedUpdateFrames = 0;
SkippedEvalFrames = 0;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SoundSubmix.cpp:277
Scope (from outer to inner):
file
function void USoundSubmix::AddSpectralAnalysisDelegate
Source code excerpt:
}
void USoundSubmix::AddSpectralAnalysisDelegate(const UObject* WorldContextObject, const TArray<FSoundSubmixSpectralAnalysisBandSettings>& InBandSettings, const FOnSubmixSpectralAnalysisBP& OnSubmixSpectralAnalysisBP, float UpdateRate, float DecibelNoiseFloor, bool bDoNormalize, bool bDoAutoRange, float AutoRangeAttackTime, float AutoRangeReleaseTime)
{
if (!GEngine)
{
return;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SoundSubmix.cpp:290
Scope (from outer to inner):
file
function void USoundSubmix::AddSpectralAnalysisDelegate
Source code excerpt:
if (FAudioDevice* AudioDevice = ThisWorld->GetAudioDeviceRaw())
{
FSoundSpectrumAnalyzerDelegateSettings DelegateSettings = USoundSubmix::GetSpectrumAnalysisDelegateSettings(InBandSettings, UpdateRate, DecibelNoiseFloor, bDoNormalize, bDoAutoRange, AutoRangeAttackTime, AutoRangeReleaseTime);
AudioDevice->AddSpectralAnalysisDelegate(this, DelegateSettings, OnSubmixSpectralAnalysisBP);
}
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SoundSubmix.cpp:1221
Scope (from outer to inner):
file
function FSoundSpectrumAnalyzerDelegateSettings USoundSubmix::GetSpectrumAnalysisDelegateSettings
Source code excerpt:
}
FSoundSpectrumAnalyzerDelegateSettings USoundSubmix::GetSpectrumAnalysisDelegateSettings(const TArray<FSoundSubmixSpectralAnalysisBandSettings>& InBandSettings, float UpdateRate, float DecibelNoiseFloor, bool bDoNormalize, bool bDoAutoRange, float AutoRangeAttackTime, float AutoRangeReleaseTime)
{
FSoundSpectrumAnalyzerDelegateSettings DelegateSettings;
DelegateSettings.BandSettings = InBandSettings;
DelegateSettings.UpdateRate = UpdateRate;
DelegateSettings.DecibelNoiseFloor = DecibelNoiseFloor;
DelegateSettings.bDoNormalize = bDoNormalize;
DelegateSettings.bDoAutoRange = bDoAutoRange;
DelegateSettings.AutoRangeAttackTime = AutoRangeAttackTime;
DelegateSettings.AutoRangeReleaseTime = AutoRangeReleaseTime;