diff --git a/osu.Game/Rulesets/UI/HitObjectContainer.cs b/osu.Game/Rulesets/UI/HitObjectContainer.cs
index e919e4d088..099be486b3 100644
--- a/osu.Game/Rulesets/UI/HitObjectContainer.cs
+++ b/osu.Game/Rulesets/UI/HitObjectContainer.cs
@@ -51,11 +51,6 @@ namespace osu.Game.Rulesets.UI
[Resolved(CanBeNull = true)]
private IPooledHitObjectProvider pooledObjectProvider { get; set; }
- ///
- /// Invoked when a is updated.
- ///
- public event Action HitObjectUpdated;
-
public HitObjectContainer()
{
RelativeSizeAxes = Axes.Both;
@@ -113,7 +108,6 @@ namespace osu.Game.Rulesets.UI
drawable.OnNewResult += onNewResult;
bindStartTime(drawable);
- bindUpdated(drawable);
AddInternal(drawable);
}
@@ -122,7 +116,7 @@ namespace osu.Game.Rulesets.UI
drawable.OnNewResult -= onNewResult;
unbindStartTime(drawable);
- unbindUpdated(drawable);
+
RemoveInternal(drawable, false);
}
@@ -182,27 +176,6 @@ namespace osu.Game.Rulesets.UI
startTimeMap.Clear();
}
- private void bindUpdated(DrawableHitObject hitObject)
- {
- hitObject.DefaultsApplied += onDefaultsApplied;
- }
-
- private void unbindUpdated(DrawableHitObject hitObject)
- {
- hitObject.DefaultsApplied += onDefaultsApplied;
- }
-
- private void unbindAllUpdated()
- {
- foreach (var h in AliveObjects)
- unbindUpdated(h);
- }
-
- private void onDefaultsApplied(DrawableHitObject obj)
- {
- HitObjectUpdated?.Invoke(obj.HitObject);
- }
-
protected override int Compare(Drawable x, Drawable y)
{
if (!(x is DrawableHitObject xObj) || !(y is DrawableHitObject yObj))
@@ -219,7 +192,6 @@ namespace osu.Game.Rulesets.UI
{
base.Dispose(isDisposing);
unbindAllStartTimes();
- unbindAllUpdated();
}
}
}
diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs
index 9a4d082a06..e9c35555c8 100644
--- a/osu.Game/Rulesets/UI/Playfield.cs
+++ b/osu.Game/Rulesets/UI/Playfield.cs
@@ -111,7 +111,7 @@ namespace osu.Game.Rulesets.UI
private readonly HitObjectEntryManager entryManager = new HitObjectEntryManager();
- private readonly LinkedList judgedEntries;
+ private readonly Stack judgedEntries;
///
/// Creates a new .
@@ -125,13 +125,12 @@ namespace osu.Game.Rulesets.UI
h.NewResult += onNewResult;
h.HitObjectUsageBegan += o => HitObjectUsageBegan?.Invoke(o);
h.HitObjectUsageFinished += o => HitObjectUsageFinished?.Invoke(o);
- h.HitObjectUpdated += onHitObjectUpdated;
}));
entryManager.OnEntryAdded += onEntryAdded;
entryManager.OnEntryRemoved += onEntryRemoved;
- judgedEntries = new LinkedList();
+ judgedEntries = new Stack();
}
[BackgroundDependencyLoader]
@@ -271,16 +270,15 @@ namespace osu.Game.Rulesets.UI
}
// When rewinding, revert future judgements in the reverse order.
- while (judgedEntries.Last is not null)
+ while (judgedEntries.Count > 0)
{
- var result = judgedEntries.Last.Value.Result;
+ var result = judgedEntries.Peek().Result;
Debug.Assert(result?.RawTime != null);
if (Time.Current >= result.RawTime.Value)
break;
- revertResult(judgedEntries.Last.Value);
- judgedEntries.RemoveLast();
+ revertResult(judgedEntries.Pop());
}
}
@@ -473,31 +471,10 @@ namespace osu.Game.Rulesets.UI
#endregion
- private void onHitObjectUpdated(HitObject _)
- {
- // The time of judged entries may have changed, so we need to re-sort the list to preserve the invariant of monotone time.
- // Insertion sort on linked-list is O(n) for nearly-sorted lists, which is the case here.
- var current = judgedEntries.First;
-
- while (current?.Next is not null)
- {
- var next = current.Next;
-
- if (current.Value.Result?.RawTime > next.Value.Result?.RawTime)
- {
- judgedEntries.Remove(next);
- judgedEntries.AddBefore(current, next);
- current = next.Previous;
- }
- else
- current = next;
- }
- }
-
private void onNewResult(DrawableHitObject drawable, JudgementResult result)
{
Debug.Assert(result != null && drawable.Entry?.Result == result && result.RawTime != null);
- judgedEntries.AddLast(drawable.Entry.AsNonNull());
+ judgedEntries.Push(drawable.Entry.AsNonNull());
NewResult?.Invoke(drawable, result);
}