mirror of
https://github.com/osukey/osukey.git
synced 2025-05-06 22:27:25 +09:00
Add basic replay frame accurate "seeking".
Previously we were looping over Update, when we should instead have been looping over UpdateSubTree.
This commit is contained in:
parent
d476482493
commit
e003d9fc3c
@ -36,6 +36,38 @@ namespace osu.Game.Screens.Play
|
|||||||
Clock = new FramedClock(clock);
|
Clock = new FramedClock(clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether we running up-to-date with our parent clock.
|
||||||
|
/// If not, we will need to keep processing children until we catch up.
|
||||||
|
/// </summary>
|
||||||
|
private bool requireMoreUpdateLoops;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether we in a valid state (ie. should we keep processing children frames).
|
||||||
|
/// This should be set to false when the replay is, for instance, waiting for future frames to arrive.
|
||||||
|
/// </summary>
|
||||||
|
private bool validState;
|
||||||
|
|
||||||
|
protected override bool RequiresChildrenUpdate => base.RequiresChildrenUpdate && validState;
|
||||||
|
|
||||||
|
private bool isAttached => replayInputHandler != null && !UseParentState;
|
||||||
|
|
||||||
|
private const int max_catch_up_updates_per_frame = 50;
|
||||||
|
|
||||||
|
public override bool UpdateSubTree()
|
||||||
|
{
|
||||||
|
requireMoreUpdateLoops = true;
|
||||||
|
validState = true;
|
||||||
|
|
||||||
|
int loops = 0;
|
||||||
|
|
||||||
|
while (validState && requireMoreUpdateLoops && loops++ < 50)
|
||||||
|
if (!base.UpdateSubTree())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
if (parentClock == null) return;
|
if (parentClock == null) return;
|
||||||
@ -43,28 +75,26 @@ namespace osu.Game.Screens.Play
|
|||||||
clock.Rate = parentClock.Rate;
|
clock.Rate = parentClock.Rate;
|
||||||
clock.IsRunning = parentClock.IsRunning;
|
clock.IsRunning = parentClock.IsRunning;
|
||||||
|
|
||||||
//if a replayHandler is not attached, we should just pass-through.
|
if (!isAttached)
|
||||||
if (UseParentState || replayInputHandler == null)
|
|
||||||
{
|
{
|
||||||
clock.CurrentTime = parentClock.CurrentTime;
|
clock.CurrentTime = parentClock.CurrentTime;
|
||||||
base.Update();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
double? newTime = replayInputHandler.SetFrameFromTime(parentClock.CurrentTime);
|
double? newTime = replayInputHandler.SetFrameFromTime(parentClock.CurrentTime);
|
||||||
|
|
||||||
if (newTime == null)
|
if (newTime == null)
|
||||||
//we shouldn't execute for this time value
|
{
|
||||||
break;
|
// we shouldn't execute for this time value. probably waiting on more replay data.
|
||||||
|
validState = false;
|
||||||
if (clock.CurrentTime == parentClock.CurrentTime)
|
return;
|
||||||
break;
|
}
|
||||||
|
|
||||||
clock.CurrentTime = newTime.Value;
|
clock.CurrentTime = newTime.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
requireMoreUpdateLoops = clock.CurrentTime != parentClock.CurrentTime;
|
||||||
base.Update();
|
base.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user