diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index 7fc35fc778..a0717ec38e 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -156,10 +156,11 @@ namespace osu.Game.Rulesets.Objects.Drawables
/// If null, a hitobject is expected to be later applied via (or automatically via pooling).
///
protected DrawableHitObject([CanBeNull] HitObject initialHitObject = null)
- : base(initialHitObject != null ? new SyntheticHitObjectEntry(initialHitObject) : null)
{
- if (Entry != null)
- ensureEntryHasResult();
+ if (initialHitObject == null) return;
+
+ Entry = new SyntheticHitObjectEntry(initialHitObject);
+ ensureEntryHasResult();
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Rulesets/Objects/Pooling/PoolableDrawableWithLifetime.cs b/osu.Game/Rulesets/Objects/Pooling/PoolableDrawableWithLifetime.cs
index 4440ca8d21..d5d1a7b55c 100644
--- a/osu.Game/Rulesets/Objects/Pooling/PoolableDrawableWithLifetime.cs
+++ b/osu.Game/Rulesets/Objects/Pooling/PoolableDrawableWithLifetime.cs
@@ -5,6 +5,7 @@
using System;
using System.Diagnostics;
+using osu.Framework.Graphics;
using osu.Framework.Graphics.Performance;
using osu.Framework.Graphics.Pooling;
@@ -16,14 +17,32 @@ namespace osu.Game.Rulesets.Objects.Pooling
/// The type storing state and controlling this drawable.
public abstract class PoolableDrawableWithLifetime : PoolableDrawable where TEntry : LifetimeEntry
{
+ private TEntry? entry;
+
///
/// The entry holding essential state of this .
///
- public TEntry? Entry { get; private set; }
+ ///
+ /// If a non-null value is set before loading is started, the entry is applied when the loading is completed.
+ ///
+ public TEntry? Entry
+ {
+ get => entry;
+
+ set
+ {
+ if (LoadState < LoadState.Ready)
+ entry = value;
+ else if (value != null)
+ Apply(value);
+ else if (HasEntryApplied)
+ free();
+ }
+ }
///
/// Whether is applied to this .
- /// When an initial entry is specified in the constructor, is set but not applied until loading is completed.
+ /// When an is set during initialization, it is not applied until loading is completed.
///
protected bool HasEntryApplied { get; private set; }
@@ -65,7 +84,7 @@ namespace osu.Game.Rulesets.Objects.Pooling
{
base.LoadAsyncComplete();
- // Apply the initial entry given in the constructor.
+ // Apply the initial entry.
if (Entry != null && !HasEntryApplied)
Apply(Entry);
}
@@ -79,7 +98,7 @@ namespace osu.Game.Rulesets.Objects.Pooling
if (HasEntryApplied)
free();
- Entry = entry;
+ this.entry = entry;
entry.LifetimeChanged += setLifetimeFromEntry;
setLifetimeFromEntry(entry);
@@ -113,12 +132,12 @@ namespace osu.Game.Rulesets.Objects.Pooling
private void free()
{
- Debug.Assert(Entry != null && HasEntryApplied);
+ Debug.Assert(entry != null && HasEntryApplied);
- OnFree(Entry);
+ OnFree(entry);
- Entry.LifetimeChanged -= setLifetimeFromEntry;
- Entry = null;
+ entry.LifetimeChanged -= setLifetimeFromEntry;
+ entry = null;
base.LifetimeStart = double.MinValue;
base.LifetimeEnd = double.MaxValue;