Fix UpdateableBeatmapBackgroundSprite not disposing of previously loaded sprites

This commit is contained in:
Jamie Taylor
2019-03-06 18:18:47 +09:00
parent 00cdb3a44a
commit eb80549782

View File

@ -9,7 +9,7 @@ using osu.Framework.Graphics.Containers;
namespace osu.Game.Beatmaps.Drawables namespace osu.Game.Beatmaps.Drawables
{ {
/// <summary> /// <summary>
/// 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.
/// </summary> /// </summary>
public class UpdateableBeatmapBackgroundSprite : ModelBackedDrawable<BeatmapInfo> public class UpdateableBeatmapBackgroundSprite : ModelBackedDrawable<BeatmapInfo>
{ {
@ -26,16 +26,33 @@ namespace osu.Game.Beatmaps.Drawables
this.beatmapSetCoverType = beatmapSetCoverType; this.beatmapSetCoverType = beatmapSetCoverType;
} }
protected override Drawable CreateDrawable(BeatmapInfo model) private BeatmapInfo lastModel;
protected override DelayedLoadWrapper CreateDelayedLoadWrapper(Drawable content, double timeBeforeLoad)
{ {
return new DelayedLoadUnloadWrapper(() => return new DelayedLoadUnloadWrapper(() =>
{
// 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);
// 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 Drawable CreateDrawable(BeatmapInfo model)
{ {
Drawable drawable; Drawable drawable;
var localBeatmap = beatmaps.GetWorkingBeatmap(model); var localBeatmap = beatmaps.GetWorkingBeatmap(model);
if (model?.BeatmapSet?.OnlineInfo != null) if (model?.BeatmapSet?.OnlineInfo != null)
{
drawable = new BeatmapSetCover(model.BeatmapSet, beatmapSetCoverType); drawable = new BeatmapSetCover(model.BeatmapSet, beatmapSetCoverType);
}
else if (localBeatmap.BeatmapInfo.ID != 0) else if (localBeatmap.BeatmapInfo.ID != 0)
{ {
// Fall back to local background if one exists // Fall back to local background if one exists
@ -54,9 +71,6 @@ namespace osu.Game.Beatmaps.Drawables
drawable.OnLoadComplete = d => d.FadeInFromZero(400); drawable.OnLoadComplete = d => d.FadeInFromZero(400);
return drawable; return drawable;
}, 500, 10000);
} }
protected override double FadeDuration => 0;
} }
} }