From c4af2bbf69f81f7349d683011dc286a2333a0b07 Mon Sep 17 00:00:00 2001 From: Givikap120 Date: Tue, 26 Mar 2024 02:55:06 +0200 Subject: [PATCH] optimisation --- .../Difficulty/Evaluators/ReadingEvaluator.cs | 8 +++----- .../Preprocessing/OsuDifficultyHitObject.cs | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs index fde3ebe7e9..0987d3630a 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs @@ -192,7 +192,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators if (current.BaseObject is Spinner || current.Index == 0) return 0; - double difficulty = Math.Pow(4 * Math.Log(Math.Max(1, EvaluateDensityOf(current))), 2.5); + double difficulty = Math.Pow(4 * Math.Log(Math.Max(1, ((OsuDifficultyHitObject)current).Density)), 2.5); double overlapBonus = EvaluateOverlapDifficultyOf(current) * difficulty; difficulty += overlapBonus; @@ -202,7 +202,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators public static double EvaluateAimingDensityFactorOf(DifficultyHitObject current) { - double difficulty = EvaluateDensityOf(current); + double difficulty = ((OsuDifficultyHitObject)current).Density; double overlapBonus = EvaluateOverlapDifficultyOf(current) * difficulty; difficulty += overlapBonus * 0.1; // Overlaps should affect aiming part much less @@ -330,10 +330,8 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators { var currObj = (OsuDifficultyHitObject)current; - double density = ReadingEvaluator.EvaluateDensityOf(current, false); - // Consider that density matters only starting from 3rd note on the screen - double densityFactor = Math.Max(0, density - 1) / 4; + double densityFactor = Math.Max(0, currObj.Density - 1) / 4; // This is kinda wrong cuz it returns value bigger than preempt // double timeSpentInvisible = getDurationSpentInvisible(currObj) / 1000 / currObj.ClockRate; diff --git a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs index 47efc28cbb..640c2c1ab4 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs @@ -90,6 +90,11 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing /// public double RhythmDifficulty { get; private set; } + /// + /// Density of the object for given preempt. Saved for optimization, density calculation is expensive. + /// + public double Density { get; private set; } + /// /// Objects that was visible after the note was hit together with cumulative overlapping difficulty. Saved for optimization to avoid O(x^4) time complexity. /// @@ -140,8 +145,13 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing setDistances(clockRate); RhythmDifficulty = RhythmEvaluator.EvaluateDifficultyOf(this); + Density = ReadingEvaluator.EvaluateDensityOf(this); + OverlapObjects = getOverlapObjects(); + } - OverlapObjects = new List(); + private List getOverlapObjects() + { + List overlapObjects = new List(); double totalOverlapnessDifficulty = 0; double currentTime = DeltaTime; @@ -204,9 +214,11 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing } totalOverlapnessDifficulty += currentOverlapness; - OverlapObjects.Add(new OverlapObject(loopObj, totalOverlapnessDifficulty)); + overlapObjects.Add(new OverlapObject(loopObj, totalOverlapnessDifficulty)); prevObject = loopObj; } + + return overlapObjects; } private static double getSimilarity(double timeA, double timeB)