mirror of
https://github.com/osukey/osukey.git
synced 2025-08-07 00:23:59 +09:00
Fix multiple issues with timekeeping
- Using realtime (`DateTimeOffset.Now`) meant that values would be changing in the same frame, causing misfirings or incorrect displays - No debounce on sample playback meant that scheduling edge cases could potentially cause samples to be played more than once.
This commit is contained in:
@ -48,7 +48,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
}
|
}
|
||||||
|
|
||||||
private MultiplayerCountdown countdown;
|
private MultiplayerCountdown countdown;
|
||||||
private DateTimeOffset countdownChangeTime;
|
private double countdownChangeTime;
|
||||||
private ScheduledDelegate countdownUpdateDelegate;
|
private ScheduledDelegate countdownUpdateDelegate;
|
||||||
|
|
||||||
private void onRoomUpdated() => Scheduler.AddOnce(() =>
|
private void onRoomUpdated() => Scheduler.AddOnce(() =>
|
||||||
@ -56,7 +56,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
if (countdown != room?.Countdown)
|
if (countdown != room?.Countdown)
|
||||||
{
|
{
|
||||||
countdown = room?.Countdown;
|
countdown = room?.Countdown;
|
||||||
countdownChangeTime = DateTimeOffset.Now;
|
countdownChangeTime = Time.Current;
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleNextCountdownUpdate();
|
scheduleNextCountdownUpdate();
|
||||||
@ -86,13 +86,27 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
|
|
||||||
int secondsRemaining = countdownTimeRemaining.Seconds;
|
int secondsRemaining = countdownTimeRemaining.Seconds;
|
||||||
|
|
||||||
if (secondsRemaining < 10) countdownTickSample?.Play();
|
playTickSound(secondsRemaining);
|
||||||
if (secondsRemaining <= 3) countdownTickFinalSample?.Play();
|
|
||||||
|
|
||||||
scheduleNextCountdownUpdate();
|
if (secondsRemaining > 0)
|
||||||
|
scheduleNextCountdownUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double? lastTickSampleTime;
|
||||||
|
|
||||||
|
private void playTickSound(int secondsRemaining)
|
||||||
|
{
|
||||||
|
// Simplified debounce. Ticks should only be played roughly once per second regardless of how often this function is called.
|
||||||
|
if (Time.Current - lastTickSampleTime < 500)
|
||||||
|
return;
|
||||||
|
|
||||||
|
lastTickSampleTime = Time.Current;
|
||||||
|
|
||||||
|
if (secondsRemaining < 10) countdownTickSample?.Play();
|
||||||
|
if (secondsRemaining <= 3) countdownTickFinalSample?.Play();
|
||||||
|
}
|
||||||
|
|
||||||
private void updateButtonText()
|
private void updateButtonText()
|
||||||
{
|
{
|
||||||
if (room == null)
|
if (room == null)
|
||||||
@ -146,13 +160,13 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
TimeSpan timeElapsed = DateTimeOffset.Now - countdownChangeTime;
|
double timeElapsed = Time.Current - countdownChangeTime;
|
||||||
TimeSpan remaining;
|
TimeSpan remaining;
|
||||||
|
|
||||||
if (timeElapsed > countdown.TimeRemaining)
|
if (timeElapsed > countdown.TimeRemaining.TotalMilliseconds)
|
||||||
remaining = TimeSpan.Zero;
|
remaining = TimeSpan.Zero;
|
||||||
else
|
else
|
||||||
remaining = countdown.TimeRemaining - timeElapsed;
|
remaining = countdown.TimeRemaining - TimeSpan.FromMilliseconds(timeElapsed);
|
||||||
|
|
||||||
return remaining;
|
return remaining;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user