1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 16:52:54 +08:00

Revert "Ensure invariant of monotone time"

This reverts commit 5d1ccc2601.
This commit is contained in:
OliBomby 2023-08-21 13:02:23 +02:00
parent c7b1c75379
commit 5bc11ed358
2 changed files with 7 additions and 58 deletions

View File

@ -51,11 +51,6 @@ namespace osu.Game.Rulesets.UI
[Resolved(CanBeNull = true)] [Resolved(CanBeNull = true)]
private IPooledHitObjectProvider pooledObjectProvider { get; set; } private IPooledHitObjectProvider pooledObjectProvider { get; set; }
/// <summary>
/// Invoked when a <see cref="HitObject"/> is updated.
/// </summary>
public event Action<HitObject> HitObjectUpdated;
public HitObjectContainer() public HitObjectContainer()
{ {
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
@ -113,7 +108,6 @@ namespace osu.Game.Rulesets.UI
drawable.OnNewResult += onNewResult; drawable.OnNewResult += onNewResult;
bindStartTime(drawable); bindStartTime(drawable);
bindUpdated(drawable);
AddInternal(drawable); AddInternal(drawable);
} }
@ -122,7 +116,7 @@ namespace osu.Game.Rulesets.UI
drawable.OnNewResult -= onNewResult; drawable.OnNewResult -= onNewResult;
unbindStartTime(drawable); unbindStartTime(drawable);
unbindUpdated(drawable);
RemoveInternal(drawable, false); RemoveInternal(drawable, false);
} }
@ -182,27 +176,6 @@ namespace osu.Game.Rulesets.UI
startTimeMap.Clear(); 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) protected override int Compare(Drawable x, Drawable y)
{ {
if (!(x is DrawableHitObject xObj) || !(y is DrawableHitObject yObj)) if (!(x is DrawableHitObject xObj) || !(y is DrawableHitObject yObj))
@ -219,7 +192,6 @@ namespace osu.Game.Rulesets.UI
{ {
base.Dispose(isDisposing); base.Dispose(isDisposing);
unbindAllStartTimes(); unbindAllStartTimes();
unbindAllUpdated();
} }
} }
} }

View File

@ -111,7 +111,7 @@ namespace osu.Game.Rulesets.UI
private readonly HitObjectEntryManager entryManager = new HitObjectEntryManager(); private readonly HitObjectEntryManager entryManager = new HitObjectEntryManager();
private readonly LinkedList<HitObjectLifetimeEntry> judgedEntries; private readonly Stack<HitObjectLifetimeEntry> judgedEntries;
/// <summary> /// <summary>
/// Creates a new <see cref="Playfield"/>. /// Creates a new <see cref="Playfield"/>.
@ -125,13 +125,12 @@ namespace osu.Game.Rulesets.UI
h.NewResult += onNewResult; h.NewResult += onNewResult;
h.HitObjectUsageBegan += o => HitObjectUsageBegan?.Invoke(o); h.HitObjectUsageBegan += o => HitObjectUsageBegan?.Invoke(o);
h.HitObjectUsageFinished += o => HitObjectUsageFinished?.Invoke(o); h.HitObjectUsageFinished += o => HitObjectUsageFinished?.Invoke(o);
h.HitObjectUpdated += onHitObjectUpdated;
})); }));
entryManager.OnEntryAdded += onEntryAdded; entryManager.OnEntryAdded += onEntryAdded;
entryManager.OnEntryRemoved += onEntryRemoved; entryManager.OnEntryRemoved += onEntryRemoved;
judgedEntries = new LinkedList<HitObjectLifetimeEntry>(); judgedEntries = new Stack<HitObjectLifetimeEntry>();
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
@ -271,16 +270,15 @@ namespace osu.Game.Rulesets.UI
} }
// When rewinding, revert future judgements in the reverse order. // 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); Debug.Assert(result?.RawTime != null);
if (Time.Current >= result.RawTime.Value) if (Time.Current >= result.RawTime.Value)
break; break;
revertResult(judgedEntries.Last.Value); revertResult(judgedEntries.Pop());
judgedEntries.RemoveLast();
} }
} }
@ -473,31 +471,10 @@ namespace osu.Game.Rulesets.UI
#endregion #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) private void onNewResult(DrawableHitObject drawable, JudgementResult result)
{ {
Debug.Assert(result != null && drawable.Entry?.Result == result && result.RawTime != null); 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); NewResult?.Invoke(drawable, result);
} }