diff --git a/osu.Game/Rulesets/Edit/DrawableEditRuleset.cs b/osu.Game/Rulesets/Edit/DrawableEditRuleset.cs
index 2200caeb20..e85ebb5f3a 100644
--- a/osu.Game/Rulesets/Edit/DrawableEditRuleset.cs
+++ b/osu.Game/Rulesets/Edit/DrawableEditRuleset.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.Linq;
+using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
@@ -57,7 +58,12 @@ namespace osu.Game.Rulesets.Edit
this.drawableRuleset = drawableRuleset;
InternalChild = drawableRuleset;
+ }
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ drawableRuleset.FrameStablePlayback = false;
Playfield.DisplayJudgements.Value = false;
}
diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs
index ac81fdc719..eb14bd1f24 100644
--- a/osu.Game/Rulesets/UI/DrawableRuleset.cs
+++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs
@@ -62,6 +62,15 @@ namespace osu.Game.Rulesets.UI
public override GameplayClock FrameStableClock => frameStabilityContainer.GameplayClock;
+ ///
+ /// Whether to enable frame-stable playback.
+ ///
+ internal bool FrameStablePlayback
+ {
+ get => frameStabilityContainer.FrameStablePlayback;
+ set => frameStabilityContainer.FrameStablePlayback = value;
+ }
+
///
/// Invoked when a has been applied by a .
///
diff --git a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs
index 1cc56fff8b..05d3c02381 100644
--- a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs
+++ b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs
@@ -24,6 +24,11 @@ namespace osu.Game.Rulesets.UI
///
public int MaxCatchUpFrames { get; set; } = 5;
+ ///
+ /// Whether to enable frame-stable playback.
+ ///
+ internal bool FrameStablePlayback = true;
+
[Cached]
public GameplayClock GameplayClock { get; }
@@ -113,7 +118,13 @@ namespace osu.Game.Rulesets.UI
try
{
- if (firstConsumption)
+ if (!FrameStablePlayback)
+ {
+ manualClock.CurrentTime = newProposedTime;
+ requireMoreUpdateLoops = false;
+ return;
+ }
+ else if (firstConsumption)
{
// On the first update, frame-stability seeking would result in unexpected/unwanted behaviour.
// Instead we perform an initial seek to the proposed time.