1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-14 03:25:11 +08:00

Avoid division when slicing node sample list

This commit is contained in:
Bartłomiej Dach 2020-06-27 16:49:14 +02:00
parent 5e92809401
commit 1551c42c12

View File

@ -483,9 +483,12 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
if (!(HitObject is IHasPathWithRepeats curveData))
return null;
double segmentTime = (EndTime - HitObject.StartTime) / spanCount;
int index = (int)(segmentTime == 0 ? 0 : (time - HitObject.StartTime) / segmentTime);
// mathematically speaking this could be done by calculating (time - HitObject.StartTime) / SegmentDuration
// however, floating-point operations can introduce inaccuracies - therefore resort to iterated addition
// (all callers use this method to calculate repeat point times, so this way is consistent and deterministic)
int index = 0;
for (double nodeTime = HitObject.StartTime; nodeTime < time; nodeTime += SegmentDuration)
index += 1;
// avoid slicing the list & creating copies, if at all possible.
return index == 0 ? curveData.NodeSamples : curveData.NodeSamples.Skip(index).ToList();