diff --git a/osu.Game/Beatmaps/Drawables/UpdateableBeatmapBackgroundSprite.cs b/osu.Game/Beatmaps/Drawables/UpdateableBeatmapBackgroundSprite.cs
index 012926fb0e..773730c2fe 100644
--- a/osu.Game/Beatmaps/Drawables/UpdateableBeatmapBackgroundSprite.cs
+++ b/osu.Game/Beatmaps/Drawables/UpdateableBeatmapBackgroundSprite.cs
@@ -9,7 +9,7 @@ using osu.Framework.Graphics.Containers;
namespace osu.Game.Beatmaps.Drawables
{
///
- /// Display a baetmap background from a local source, but fallback to online source if not available.
+ /// Display a beatmap background from a local source, but fallback to online source if not available.
///
public class UpdateableBeatmapBackgroundSprite : ModelBackedDrawable
{
@@ -26,37 +26,51 @@ namespace osu.Game.Beatmaps.Drawables
this.beatmapSetCoverType = beatmapSetCoverType;
}
- protected override Drawable CreateDrawable(BeatmapInfo model)
+ private BeatmapInfo lastModel;
+
+ protected override DelayedLoadWrapper CreateDelayedLoadWrapper(Drawable content, double timeBeforeLoad)
{
return new DelayedLoadUnloadWrapper(() =>
{
- Drawable drawable;
+ // If DelayedLoadUnloadWrapper is attempting to RELOAD the same content (Beatmap), that means that it was
+ // previously UNLOADED and thus its children have been disposed of, so we need to recreate them here.
+ if (lastModel == Beatmap.Value)
+ return CreateDrawable(Beatmap.Value);
- var localBeatmap = beatmaps.GetWorkingBeatmap(model);
-
- if (model?.BeatmapSet?.OnlineInfo != null)
- drawable = new BeatmapSetCover(model.BeatmapSet, beatmapSetCoverType);
- else if (localBeatmap.BeatmapInfo.ID != 0)
- {
- // Fall back to local background if one exists
- drawable = new BeatmapBackgroundSprite(localBeatmap);
- }
- else
- {
- // Use the default background if somehow an online set does not exist and we don't have a local copy.
- drawable = new BeatmapBackgroundSprite(beatmaps.DefaultBeatmap);
- }
-
- drawable.RelativeSizeAxes = Axes.Both;
- drawable.Anchor = Anchor.Centre;
- drawable.Origin = Anchor.Centre;
- drawable.FillMode = FillMode.Fill;
- drawable.OnLoadComplete = d => d.FadeInFromZero(400);
-
- return drawable;
+ // If the model has changed since the previous unload (or if there was no load), then we can safely use the given content
+ lastModel = Beatmap.Value;
+ return content;
}, 500, 10000);
}
- protected override double FadeDuration => 0;
+ protected override Drawable CreateDrawable(BeatmapInfo model)
+ {
+ Drawable drawable;
+
+ var localBeatmap = beatmaps.GetWorkingBeatmap(model);
+
+ if (model?.BeatmapSet?.OnlineInfo != null)
+ {
+ drawable = new BeatmapSetCover(model.BeatmapSet, beatmapSetCoverType);
+ }
+ else if (localBeatmap.BeatmapInfo.ID != 0)
+ {
+ // Fall back to local background if one exists
+ drawable = new BeatmapBackgroundSprite(localBeatmap);
+ }
+ else
+ {
+ // Use the default background if somehow an online set does not exist and we don't have a local copy.
+ drawable = new BeatmapBackgroundSprite(beatmaps.DefaultBeatmap);
+ }
+
+ drawable.RelativeSizeAxes = Axes.Both;
+ drawable.Anchor = Anchor.Centre;
+ drawable.Origin = Anchor.Centre;
+ drawable.FillMode = FillMode.Fill;
+ drawable.OnLoadComplete = d => d.FadeInFromZero(400);
+
+ return drawable;
+ }
}
}