Consistent 0.5s update frequency on input images regardless of number of events

This commit is contained in:
Steve Streeting 2022-02-01 16:58:53 +00:00
parent 44f83c1f18
commit 2e841e3e3d
3 changed files with 19 additions and 2 deletions

View File

@ -15,6 +15,7 @@ TSharedRef<SWidget> UInputImage::RebuildWidget()
bSubbedToInputEvents = true; bSubbedToInputEvents = true;
GS->OnInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged); GS->OnInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged);
GS->OnButtonInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged); GS->OnButtonInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged);
GS->OnAxisInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged);
} }
UpdateImage(); UpdateImage();
@ -25,11 +26,12 @@ void UInputImage::OnInputModeChanged(int ChangedPlayerIdx, EInputMode InputMode)
{ {
if (ChangedPlayerIdx == PlayerIndex) if (ChangedPlayerIdx == PlayerIndex)
{ {
// Delay update, in case multiple received in short succession
MarkImageDirty();
// auto GS = GetStevesGameSubsystem(GetWorld()); // auto GS = GetStevesGameSubsystem(GetWorld());
// UE_LOG(LogTemp, Warning, TEXT("Updating image for input mode change: %s Button device: %s"), // UE_LOG(LogTemp, Warning, TEXT("Updating image for input mode change: %s Button device: %s"),
// *UEnum::GetValueAsString(InputMode), // *UEnum::GetValueAsString(InputMode),
// *UEnum::GetValueAsString(GS->GetLastInputButtonPressed(ChangedPlayerIdx))); // *UEnum::GetValueAsString(GS->GetLastInputButtonPressed(ChangedPlayerIdx)));
UpdateImage();
} }
} }
@ -48,6 +50,7 @@ void UInputImage::BeginDestroy()
{ {
GS->OnInputModeChanged.RemoveAll(this); GS->OnInputModeChanged.RemoveAll(this);
GS->OnButtonInputModeChanged.RemoveAll(this); GS->OnButtonInputModeChanged.RemoveAll(this);
GS->OnAxisInputModeChanged.RemoveAll(this);
} }
} }
@ -104,4 +107,15 @@ void UInputImage::UpdateImage()
SetBrushFromAtlasInterface(Sprite, true); SetBrushFromAtlasInterface(Sprite, true);
} }
} }
DelayedUpdateImageTimer.Invalidate();
}
void UInputImage::MarkImageDirty()
{
if (!DelayedUpdateImageTimer.IsValid())
{
// Delayed update
GetWorld()->GetTimerManager().SetTimer(DelayedUpdateImageTimer, this, &UInputImage::UpdateImage, 0.5f);
}
} }

View File

@ -154,7 +154,7 @@ public:
} }
} }
TimeUntilNextSpriteCheck = 0.25f; TimeUntilNextSpriteCheck = 0.5f;
} }
} }
}; };

View File

@ -40,6 +40,8 @@ protected:
UUiTheme* CustomTheme; UUiTheme* CustomTheme;
bool bSubbedToInputEvents = false; bool bSubbedToInputEvents = false;
FTimerHandle DelayedUpdateImageTimer;
public: public:
/// Tell this image to display the bound action for the current input method /// Tell this image to display the bound action for the current input method
@ -78,6 +80,7 @@ public:
protected: protected:
virtual TSharedRef<SWidget> RebuildWidget() override; virtual TSharedRef<SWidget> RebuildWidget() override;
virtual void MarkImageDirty();
virtual void UpdateImage(); virtual void UpdateImage();
UFUNCTION() UFUNCTION()