1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-16 08:42:55 +08:00

Merge pull request #782 from peppy/fix-fail-pause-conflict

Fix and simplify pause logic
This commit is contained in:
Dan Balasescu 2017-05-18 01:22:00 +09:00 committed by GitHub
commit 55d4d83712
2 changed files with 16 additions and 12 deletions

@ -1 +1 @@
Subproject commit 67f39580365f7d0a42f8788eae2b60881dde1c67
Subproject commit f8e5b10f6883af83ffbc431b03fe4ee3e89797a6

View File

@ -38,7 +38,7 @@ namespace osu.Game.Screens.Play
public Action RestartRequested;
public bool IsPaused => !decoupledClock.IsRunning;
public bool IsPaused { get; private set; }
internal override bool AllowRulesetChange => false;
@ -264,19 +264,18 @@ namespace osu.Game.Screens.Play
{
if (!canPause && !force) return;
// the actual pausing is potentially happening on a different thread.
// we want to wait for the source clock to stop so we can be sure all components are in a stable state.
if (!IsPaused)
{
decoupledClock.Stop();
if (IsPaused) return;
Schedule(() => Pause(force));
return;
}
// stop the decoupled clock (stops the audio eventually)
decoupledClock.Stop();
// stop processing updatess on the offset clock (instantly freezes time for all our components)
offsetClock.ProcessSourceClockFrames = false;
IsPaused = true;
// we need to do a final check after all of our children have processed up to the paused clock time.
// this is to cover cases where, for instance, the player fails in the last processed frame (which would change canPause).
// as the scheduler runs before children updates, let's schedule for the next frame.
// this is to cover cases where, for instance, the player fails in the current processing frame.
Schedule(() =>
{
if (!canPause) return;
@ -291,6 +290,11 @@ namespace osu.Game.Screens.Play
public void Resume()
{
if (!IsPaused) return;
IsPaused = false;
offsetClock.ProcessSourceClockFrames = true;
lastPauseActionTime = Time.Current;
hudOverlay.KeyCounter.IsCounting = true;
hudOverlay.Progress.Hide();