diff --git a/osu.Game/Beatmaps/BeatmapDifficultyCache.cs b/osu.Game/Beatmaps/BeatmapDifficultyCache.cs
index ef0fa36b16..493de5bef4 100644
--- a/osu.Game/Beatmaps/BeatmapDifficultyCache.cs
+++ b/osu.Game/Beatmaps/BeatmapDifficultyCache.cs
@@ -81,6 +81,11 @@ namespace osu.Game.Beatmaps
}, true);
}
+ public void Invalidate(IBeatmapInfo beatmap)
+ {
+ base.Invalidate(lookup => lookup.BeatmapInfo.Equals(beatmap));
+ }
+
///
/// Retrieves a bindable containing the star difficulty of a that follows the currently-selected ruleset and mods.
///
diff --git a/osu.Game/Beatmaps/BeatmapUpdater.cs b/osu.Game/Beatmaps/BeatmapUpdater.cs
index a24407a734..e6703dd8d0 100644
--- a/osu.Game/Beatmaps/BeatmapUpdater.cs
+++ b/osu.Game/Beatmaps/BeatmapUpdater.cs
@@ -61,6 +61,8 @@ namespace osu.Game.Beatmaps
var working = workingBeatmapCache.GetWorkingBeatmap(beatmap);
beatmap.Length = calculateLength(working.Beatmap);
beatmap.BPM = 60000 / working.Beatmap.GetMostCommonBeatLength();
+
+ difficultyCache.Invalidate(beatmap);
}
}
diff --git a/osu.Game/Database/MemoryCachingComponent.cs b/osu.Game/Database/MemoryCachingComponent.cs
index 6e6d928dcc..215050460b 100644
--- a/osu.Game/Database/MemoryCachingComponent.cs
+++ b/osu.Game/Database/MemoryCachingComponent.cs
@@ -3,6 +3,7 @@
#nullable disable
+using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
@@ -39,6 +40,15 @@ namespace osu.Game.Database
return computed;
}
+ protected void Invalidate(Func invalidationFunction)
+ {
+ foreach (var kvp in cache)
+ {
+ if (invalidationFunction(kvp.Key))
+ cache.TryRemove(kvp.Key, out _);
+ }
+ }
+
protected bool CheckExists([NotNull] TLookup lookup, out TValue value) =>
cache.TryGetValue(lookup, out value);