From 912c0a39cf787cb0c021fa6c9cc03feb1ac4e72f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 5 Sep 2025 16:10:12 +0900 Subject: [PATCH] Change debounce to be delayed since last actual change to avoid state flickering --- .../Screens/Play/HUD/DefaultRankDisplay.cs | 21 ++++++++++--------- osu.Game/Skinning/LegacyRankDisplay.cs | 21 ++++++++++--------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/DefaultRankDisplay.cs b/osu.Game/Screens/Play/HUD/DefaultRankDisplay.cs index dd8c324c9e..59e7ce3b10 100644 --- a/osu.Game/Screens/Play/HUD/DefaultRankDisplay.cs +++ b/osu.Game/Screens/Play/HUD/DefaultRankDisplay.cs @@ -33,11 +33,11 @@ namespace osu.Game.Screens.Play.HUD private SkinnableSound rankUpSample = null!; private Bindable lastSamplePlayback = null!; - private double lastRankUpdate; + private double timeSinceChange; - private ScoreRank displayedRank; + private ScoreRank? displayedRank; - private const int minimum_update_rate = 3000; + private const int time_before_commit = 1500; public DefaultRankDisplay() { @@ -69,13 +69,14 @@ namespace osu.Game.Screens.Play.HUD var currentRank = scoreProcessor.Rank.Value; - if (currentRank != displayedRank) + if (currentRank == displayedRank) { - bool enoughTimeElapsed = Time.Current - lastRankUpdate >= minimum_update_rate; - - if (enoughTimeElapsed || currentRank == ScoreRank.F) - updateRank(currentRank); + timeSinceChange = 0; + return; } + + if ((timeSinceChange += Time.Elapsed) >= time_before_commit || scoreProcessor.HasCompleted.Value) + updateRank(currentRank); } private void updateRank(ScoreRank rank) @@ -86,7 +87,7 @@ namespace osu.Game.Screens.Play.HUD bool enoughSampleTimeElapsed = !lastSamplePlayback.Value.HasValue || Time.Current - lastSamplePlayback.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME; // Also don't play rank-down sfx on quit/retry/initial update. - if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankUpdate > 0) + if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && displayedRank != null) { if (rank > displayedRank) rankUpSample.Play(); @@ -97,7 +98,7 @@ namespace osu.Game.Screens.Play.HUD } displayedRank = rank; - lastRankUpdate = Time.Current; + timeSinceChange = 0; } } } diff --git a/osu.Game/Skinning/LegacyRankDisplay.cs b/osu.Game/Skinning/LegacyRankDisplay.cs index ee67d77487..da033d9756 100644 --- a/osu.Game/Skinning/LegacyRankDisplay.cs +++ b/osu.Game/Skinning/LegacyRankDisplay.cs @@ -35,11 +35,11 @@ namespace osu.Game.Skinning private SkinnableSound rankUpSample = null!; private Bindable lastSamplePlayback = null!; - private double lastRankUpdate; + private double timeSinceChange; - private ScoreRank displayedRank; + private ScoreRank? displayedRank; - private const int minimum_update_rate = 3000; + private const int time_before_commit = 1500; public LegacyRankDisplay() { @@ -73,13 +73,14 @@ namespace osu.Game.Skinning var currentRank = scoreProcessor.Rank.Value; - if (currentRank != displayedRank) + if (currentRank == displayedRank) { - bool enoughTimeElapsed = Time.Current - lastRankUpdate >= minimum_update_rate; - - if (enoughTimeElapsed || currentRank == ScoreRank.F) - updateRank(currentRank); + timeSinceChange = 0; + return; } + + if ((timeSinceChange += Time.Elapsed) >= time_before_commit || scoreProcessor.HasCompleted.Value) + updateRank(currentRank); } private void updateRank(ScoreRank rank) @@ -110,7 +111,7 @@ namespace osu.Game.Skinning bool enoughSampleTimeElapsed = !lastSamplePlayback.Value.HasValue || Time.Current - lastSamplePlayback.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME; // Also don't play rank-down sfx on quit/retry/initial update. - if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankUpdate > 0) + if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && displayedRank != null) { if (rank > displayedRank) rankUpSample.Play(); @@ -121,7 +122,7 @@ namespace osu.Game.Skinning } displayedRank = rank; - lastRankUpdate = Time.Current; + timeSinceChange = 0; } } }