mirror of
https://github.com/ppy/osu.git
synced 2025-01-12 17:43:05 +08:00
Allow FrameStabilityContainer to handle waiting-for-data state better (and pause outwards)
This commit is contained in:
parent
3ec3321a3d
commit
9e6b0a42ec
@ -124,20 +124,42 @@ namespace osu.Game.Rulesets.Replays
|
|||||||
|
|
||||||
if (HasFrames)
|
if (HasFrames)
|
||||||
{
|
{
|
||||||
|
var next = NextFrame;
|
||||||
|
|
||||||
// check if the next frame is valid for the current playback direction.
|
// check if the next frame is valid for the current playback direction.
|
||||||
// validity is if the next frame is equal or "earlier"
|
// validity is if the next frame is equal or "earlier"
|
||||||
var compare = time.CompareTo(NextFrame?.Time);
|
var compare = time.CompareTo(next?.Time);
|
||||||
|
|
||||||
if (compare == 0 || compare == currentDirection)
|
if (next != null && (compare == 0 || compare == currentDirection))
|
||||||
{
|
{
|
||||||
if (advanceFrame())
|
if (advanceFrame())
|
||||||
return CurrentTime = CurrentFrame.Time;
|
return CurrentTime = CurrentFrame.Time;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// if we didn't change frames, we need to ensure we are allowed to run frames in between, else return null.
|
// this is the case where the frame can't be advanced (in the replay).
|
||||||
|
// even so, we may be able to move the clock forward due to being at the end of the replay or
|
||||||
|
// in a section where replay accuracy doesn't matter.
|
||||||
|
|
||||||
|
// important section is always respected to block the update loop.
|
||||||
if (inImportantSection)
|
if (inImportantSection)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
if (next == null)
|
||||||
|
{
|
||||||
|
// in the case we have no more frames and haven't received the full replay, block.
|
||||||
|
if (!replay.HasReceivedAllFrames)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// else allow play to end.
|
||||||
|
}
|
||||||
|
else if (next.Time.CompareTo(time) != currentDirection)
|
||||||
|
{
|
||||||
|
// in the case we have more frames, block if the next frame's time is less than the current time.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we didn't change frames, we need to ensure we are allowed to run frames in between, else return null.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
public override bool UpdateSubTree()
|
public override bool UpdateSubTree()
|
||||||
{
|
{
|
||||||
requireMoreUpdateLoops = true;
|
requireMoreUpdateLoops = true;
|
||||||
|
|
||||||
validState = !frameStableClock.IsPaused.Value;
|
validState = !frameStableClock.IsPaused.Value;
|
||||||
|
|
||||||
int loops = 0;
|
int loops = 0;
|
||||||
@ -191,7 +192,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (newProposedTime != manualClock.CurrentTime)
|
if (newProposedTime != manualClock.CurrentTime)
|
||||||
direction = newProposedTime > manualClock.CurrentTime ? 1 : -1;
|
direction = newProposedTime >= manualClock.CurrentTime ? 1 : -1;
|
||||||
|
|
||||||
manualClock.CurrentTime = newProposedTime;
|
manualClock.CurrentTime = newProposedTime;
|
||||||
manualClock.Rate = Math.Abs(parentGameplayClock.Rate) * direction;
|
manualClock.Rate = Math.Abs(parentGameplayClock.Rate) * direction;
|
||||||
|
Loading…
Reference in New Issue
Block a user