From 6626e70c95557a17c07216b5514ae4d9440d92a3 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Mon, 26 Apr 2021 17:30:27 +0900 Subject: [PATCH] Pass in master clock instead of slave clock --- .../OnlinePlay/TestSceneCatchUpSyncManager.cs | 5 ++++ .../Spectate/MultiSpectatorScreen.cs | 5 +++- .../Multiplayer/Spectate/PlayerArea.cs | 8 ++++--- .../Sync/CatchUpSpectatorPlayerClock.cs | 23 +++++++++++-------- .../Spectate/Sync/ISpectatorPlayerClock.cs | 5 ++++ 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/osu.Game.Tests/OnlinePlay/TestSceneCatchUpSyncManager.cs b/osu.Game.Tests/OnlinePlay/TestSceneCatchUpSyncManager.cs index 73ec5fb934..75ba362146 100644 --- a/osu.Game.Tests/OnlinePlay/TestSceneCatchUpSyncManager.cs +++ b/osu.Game.Tests/OnlinePlay/TestSceneCatchUpSyncManager.cs @@ -168,6 +168,11 @@ namespace osu.Game.Tests.OnlinePlay public bool IsCatchingUp { get; set; } + public IFrameBasedClock Source + { + set => throw new NotImplementedException(); + } + public readonly int Id; public TestSpectatorPlayerClock(int id) diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/MultiSpectatorScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/MultiSpectatorScreen.cs index 6a8c10e336..86c975d12f 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/MultiSpectatorScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/MultiSpectatorScreen.cs @@ -79,7 +79,10 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate }; for (int i = 0; i < UserIds.Length; i++) - grid.Add(instances[i] = new PlayerArea(UserIds[i], new CatchUpSpectatorPlayerClock(masterClockContainer.GameplayClock))); + { + grid.Add(instances[i] = new PlayerArea(UserIds[i], masterClockContainer.GameplayClock)); + syncManager.AddPlayerClock(instances[i].GameplayClock); + } // Todo: This is not quite correct - it should be per-user to adjust for other mod combinations. var playableBeatmap = Beatmap.Value.GetPlayableBeatmap(Ruleset.Value); diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/PlayerArea.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/PlayerArea.cs index 2accfaec0c..3ef1693ca6 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/PlayerArea.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/PlayerArea.cs @@ -9,6 +9,7 @@ using osu.Framework.Audio; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Timing; using osu.Game.Beatmaps; using osu.Game.Graphics.UserInterface; using osu.Game.Rulesets; @@ -38,7 +39,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate /// The used to control the gameplay running state of a loaded . /// [NotNull] - public readonly ISpectatorPlayerClock GameplayClock; + public readonly ISpectatorPlayerClock GameplayClock = new CatchUpSpectatorPlayerClock(); /// /// The currently-loaded score. @@ -54,10 +55,9 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate private readonly AudioContainer audioContainer; private OsuScreenStack stack; - public PlayerArea(int userId, [NotNull] ISpectatorPlayerClock gameplayClock) + public PlayerArea(int userId, IFrameBasedClock masterClock) { UserId = userId; - GameplayClock = gameplayClock; RelativeSizeAxes = Axes.Both; Masking = true; @@ -71,6 +71,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate }, loadingLayer = new LoadingLayer(true) { State = { Value = Visibility.Visible } } }; + + GameplayClock.Source = masterClock; } public void LoadScore([NotNull] Score score) diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/CatchUpSpectatorPlayerClock.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/CatchUpSpectatorPlayerClock.cs index a8ed7b415f..e2a6b7c9ae 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/CatchUpSpectatorPlayerClock.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/CatchUpSpectatorPlayerClock.cs @@ -1,6 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +#nullable enable + using System; using osu.Framework.Bindables; using osu.Framework.Timing; @@ -17,12 +19,10 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate.Sync /// public const double CATCHUP_RATE = 2; - private readonly IFrameBasedClock masterClock; - - public CatchUpSpectatorPlayerClock(IFrameBasedClock masterClock) - { - this.masterClock = masterClock; - } + /// + /// The source clock. + /// + public IFrameBasedClock? Source { get; set; } public double CurrentTime { get; private set; } @@ -52,19 +52,22 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate.Sync public void ProcessFrame() { - masterClock.ProcessFrame(); - ElapsedFrameTime = 0; FramesPerSecond = 0; + if (Source == null) + return; + + Source.ProcessFrame(); + if (IsRunning) { - double elapsedSource = masterClock.ElapsedFrameTime; + double elapsedSource = Source.ElapsedFrameTime; double elapsed = elapsedSource * Rate; CurrentTime += elapsed; ElapsedFrameTime = elapsed; - FramesPerSecond = masterClock.FramesPerSecond; + FramesPerSecond = Source.FramesPerSecond; } } diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/ISpectatorPlayerClock.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/ISpectatorPlayerClock.cs index 46f80288c6..311969c92c 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/ISpectatorPlayerClock.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/Sync/ISpectatorPlayerClock.cs @@ -20,5 +20,10 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate.Sync /// Whether this clock is resynchronising to the master clock. /// bool IsCatchingUp { get; set; } + + /// + /// The source clock + /// + IFrameBasedClock Source { set; } } }