protected override void FreeAfterUse() { base.FreeAfterUse(); Entry.Invalidated -= onEntryInvalidated; // Return points to the pool. ClearInternal(false); Entry = null; }
private void addEntry(OsuHitObject hitObject) { var newEntry = new FollowPointLifetimeEntry(hitObject); var index = lifetimeEntries.AddInPlace(newEntry, Comparer <FollowPointLifetimeEntry> .Create((e1, e2) => { int comp = e1.Start.StartTime.CompareTo(e2.Start.StartTime); if (comp != 0) { return(comp); } // we always want to insert the new item after equal ones. // this is important for beatmaps with multiple hitobjects at the same point in time. // if we use standard comparison insert order, there will be a churn of connections getting re-updated to // the next object at the point-in-time, adding a construction/disposal overhead (see FollowPointConnection.End implementation's ClearInternal). // this is easily visible on https://osu.ppy.sh/beatmapsets/150945#osu/372245 return(-1); })); if (index < lifetimeEntries.Count - 1) { // Update the connection's end point to the next connection's start point // h1 -> -> -> h2 // connection nextGroup FollowPointLifetimeEntry nextEntry = lifetimeEntries[index + 1]; newEntry.End = nextEntry.Start; } else { // The end point may be non-null during re-ordering newEntry.End = null; } if (index > 0) { // Update the previous connection's end point to the current connection's start point // h1 -> -> -> h2 // prevGroup connection FollowPointLifetimeEntry previousEntry = lifetimeEntries[index - 1]; previousEntry.End = newEntry.Start; } lifetimeManager.AddEntry(newEntry); }
private void removeEntry(OsuHitObject hitObject) { int index = lifetimeEntries.FindIndex(e => e.Start == hitObject); var entry = lifetimeEntries[index]; entry.UnbindEvents(); lifetimeEntries.RemoveAt(index); lifetimeManager.RemoveEntry(entry); if (index > 0) { // Update the previous connection's end point to the next connection's start point // h1 -> -> -> h2 -> -> -> h3 // prevGroup connection nextGroup // The current connection's end point is used since there may not be a next connection FollowPointLifetimeEntry previousEntry = lifetimeEntries[index - 1]; previousEntry.End = entry.End; } }