Skip to content

Commit e73c3c9

Browse files
perf: deep System.Numerics hot-path optimization pass (28 files)
Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/f74b2f21-6bd8-45e8-b698-3737ddf65ed7 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
1 parent 8c7bfc0 commit e73c3c9

33 files changed

Lines changed: 59 additions & 51 deletions

osu.Game.Rulesets.Catch/Edit/Blueprints/FruitPlacementBlueprint.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, do
4848
gridSnapResult.ScreenSpacePosition.X = screenSpacePosition.X;
4949
var distanceSnapResult = Composer?.TryDistanceSnap(gridSnapResult.ScreenSpacePosition);
5050

51-
var result = distanceSnapResult != null && Vector2.Distance(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
51+
var result = distanceSnapResult != null && Vector2.DistanceSquared(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS * CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
5252
? distanceSnapResult
5353
: gridSnapResult;
5454

osu.Game.Rulesets.Catch/Edit/Blueprints/JuiceStreamPlacementBlueprint.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, do
8888
gridSnapResult.ScreenSpacePosition.X = screenSpacePosition.X;
8989
var distanceSnapResult = Composer?.TryDistanceSnap(gridSnapResult.ScreenSpacePosition);
9090

91-
var result = distanceSnapResult != null && Vector2.Distance(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
91+
var result = distanceSnapResult != null && Vector2.DistanceSquared(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS * CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
9292
? distanceSnapResult
9393
: gridSnapResult;
9494

osu.Game.Rulesets.Catch/Edit/CatchBlueprintContainer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ protected override bool TryMoveBlueprints(DragEvent e, IList<(SelectionBlueprint
5555
gridSnapResult.ScreenSpacePosition.X = movePosition.X;
5656
var distanceSnapResult = Composer.TryDistanceSnap(gridSnapResult.ScreenSpacePosition);
5757

58-
var result = distanceSnapResult != null && Vector2.Distance(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
58+
var result = distanceSnapResult != null && Vector2.DistanceSquared(gridSnapResult.ScreenSpacePosition, distanceSnapResult.ScreenSpacePosition) < CatchHitObjectComposer.DISTANCE_SNAP_RADIUS * CatchHitObjectComposer.DISTANCE_SNAP_RADIUS
5959
? distanceSnapResult
6060
: gridSnapResult;
6161

osu.Game.Rulesets.Osu/Edit/Blueprints/GridPlacementBlueprint.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, do
110110
else
111111
{
112112
// Default to the original spacing and rotation if the distance is too small.
113-
if (Vector2.Distance(gridToolboxGroup.StartPosition.Value, pos) < 2)
113+
if (Vector2.DistanceSquared(gridToolboxGroup.StartPosition.Value, pos) < 4)
114114
{
115115
gridToolboxGroup.GridLineSpacing.Value = originalSpacing;
116116
if (!gridToolboxGroup.GridLinesRotation.Disabled)

osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public override double ReadCurrentDistanceSnap(HitObject before, HitObject after
1919
{
2020
// If the pair of hit objects in question here could feasibly be on the same stack, do not provide a distance snap value -
2121
// they're likely too close to one another for the distance snap value to be useful anyway even if they somehow are not.
22-
if (Vector2.Distance(((OsuHitObject)before).EndPosition, ((OsuHitObject)after).Position) < OsuBeatmapProcessor.STACK_DISTANCE)
22+
if (Vector2.DistanceSquared(((OsuHitObject)before).EndPosition, ((OsuHitObject)after).Position) < OsuBeatmapProcessor.STACK_DISTANCE * OsuBeatmapProcessor.STACK_DISTANCE)
2323
return 0;
2424

2525
var lastObjectWithVelocity = EditorBeatmap.HitObjects.TakeWhile(ho => ho != after).OfType<IHasSliderVelocity>().LastOrDefault();

osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ private bool snapToVisibleBlueprints(Vector2 screenSpacePosition, out SnapResult
309309
if (!snapPositions.Any())
310310
continue;
311311

312-
var closestSnapPosition = snapPositions.MinBy(p => Vector2.Distance(p, screenSpacePosition));
312+
var closestSnapPosition = snapPositions.MinBy(p => Vector2.DistanceSquared(p, screenSpacePosition));
313313

314-
if (Vector2.Distance(closestSnapPosition, screenSpacePosition) < snapRadius)
314+
if (Vector2.DistanceSquared(closestSnapPosition, screenSpacePosition) < snapRadius * snapRadius)
315315
{
316316
// if the snap target is a stacked object, snap to its unstacked position rather than its stacked position.
317317
// this is intended to make working with stacks easier (because thanks to this, you can drag an object to any

osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private float getRelativeTargetAngle(float targetDistance, float offset, bool fl
129129
float angle = (float)(2.16 / (1 + 200 * Math.Exp(0.036 * (targetDistance - 310 + customOffsetX))) + 0.5);
130130
angle += offset + customOffsetY;
131131

132-
float relativeAngle = (float)Math.PI - angle;
132+
float relativeAngle = MathF.PI - angle;
133133

134134
return flowDirection ? -relativeAngle : relativeAngle;
135135
}

osu.Game.Rulesets.Osu/Mods/OsuModTargetPractice.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,8 @@ private int nodeIndexFromTime(IHasRepeats curve, double timeSinceStart)
450450

451451
private bool checkForOverlap(IEnumerable<OsuHitObject> objectsToCheck, OsuHitObject target)
452452
{
453-
return objectsToCheck.Any(h => Vector2.Distance(h.Position, target.Position) < target.Radius * 2);
453+
float radiusTwice = target.Radius * 2;
454+
return objectsToCheck.Any(h => Vector2.DistanceSquared(h.Position, target.Position) < radiusTwice * radiusTwice);
454455
}
455456

456457
/// <summary>

osu.Game.Rulesets.Osu/Mods/OsuModWiggle.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ private void drawableOnApplyCustomUpdateState(DrawableHitObject drawable, ArmedS
5757

5858
void wiggle()
5959
{
60-
float nextAngle = (float)(objRand.NextDouble() * 2 * Math.PI);
60+
float nextAngle = (float)(objRand.NextDouble() * 2) * MathF.PI;
6161
float nextDist = (float)(objRand.NextDouble() * Strength.Value * 7);
62-
drawable.MoveTo(new Vector2((float)(nextDist * Math.Cos(nextAngle) + origin.X), (float)(nextDist * Math.Sin(nextAngle) + origin.Y)), wiggle_duration);
62+
drawable.MoveTo(new Vector2(nextDist * MathF.Cos(nextAngle) + origin.X, nextDist * MathF.Sin(nextAngle) + origin.Y), wiggle_duration);
6363
}
6464

6565
for (int i = 0; i < amountWiggles; i++)

osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ private void scheduleRefresh() => Scheduler.AddOnce(() =>
6262

6363
Vector2 distanceVector = endPosition - startPosition;
6464
int distance = (int)distanceVector.Length();
65-
float rotation = (float)(Math.Atan2(distanceVector.Y, distanceVector.X) * (180 / Math.PI));
65+
float rotation = MathF.Atan2(distanceVector.Y, distanceVector.X) * (180f / MathF.PI);
6666

6767
double finalTransformEndTime = startTime;
6868

0 commit comments

Comments
 (0)