mirror of
https://github.com/ppy/osu.git
synced 2025-03-23 02:57:25 +08:00
Handle different gameplay rates when seeking on master clock
This commit is contained in:
parent
2b999f9780
commit
6556a7e3c3
@ -43,7 +43,7 @@ namespace osu.Game.Screens.Play
|
||||
Precision = 0.1,
|
||||
};
|
||||
|
||||
private double totalOffset => userOffsetClock.Offset + platformOffsetClock.Offset;
|
||||
private double totalAppliedOffset => userOffsetClock.RateAdjustedOffset + platformOffsetClock.RateAdjustedOffset;
|
||||
|
||||
private readonly BindableDouble pauseFreqAdjust = new BindableDouble(1);
|
||||
|
||||
@ -52,8 +52,8 @@ namespace osu.Game.Screens.Play
|
||||
private readonly bool startAtGameplayStart;
|
||||
private readonly double firstHitObjectTime;
|
||||
|
||||
private FramedOffsetClock userOffsetClock;
|
||||
private FramedOffsetClock platformOffsetClock;
|
||||
private HardwareCorrectionOffsetClock userOffsetClock;
|
||||
private HardwareCorrectionOffsetClock platformOffsetClock;
|
||||
private MasterGameplayClock masterGameplayClock;
|
||||
private Bindable<double> userAudioOffset;
|
||||
private double startOffset;
|
||||
@ -128,7 +128,7 @@ namespace osu.Game.Screens.Play
|
||||
{
|
||||
// remove the offset component here because most of the time we want the seek to be aligned to gameplay, not the audio track.
|
||||
// we may want to consider reversing the application of offsets in the future as it may feel more correct.
|
||||
base.Seek(time - totalOffset);
|
||||
base.Seek(time - totalAppliedOffset);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -214,13 +214,25 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
private class HardwareCorrectionOffsetClock : FramedOffsetClock
|
||||
{
|
||||
// we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this.
|
||||
// base implementation already adds offset at 1.0 rate, so we only add the difference from that here.
|
||||
public override double CurrentTime => base.CurrentTime + offsetAdjust;
|
||||
|
||||
private readonly BindableDouble pauseRateAdjust;
|
||||
|
||||
private double offsetAdjust;
|
||||
private double offset;
|
||||
|
||||
public new double Offset
|
||||
{
|
||||
get => offset;
|
||||
set
|
||||
{
|
||||
if (value == offset)
|
||||
return;
|
||||
|
||||
offset = value;
|
||||
|
||||
updateOffset();
|
||||
}
|
||||
}
|
||||
|
||||
public double RateAdjustedOffset => base.Offset;
|
||||
|
||||
public HardwareCorrectionOffsetClock(IClock source, BindableDouble pauseRateAdjust)
|
||||
: base(source)
|
||||
@ -231,10 +243,17 @@ namespace osu.Game.Screens.Play
|
||||
public override void ProcessFrame()
|
||||
{
|
||||
base.ProcessFrame();
|
||||
updateOffset();
|
||||
}
|
||||
|
||||
private void updateOffset()
|
||||
{
|
||||
// changing this during the pause transform effect will cause a potentially large offset to be suddenly applied as we approach zero rate.
|
||||
if (pauseRateAdjust.Value == 1)
|
||||
offsetAdjust = Offset * (Rate - 1);
|
||||
{
|
||||
// we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this.
|
||||
base.Offset = Offset * Rate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user