Cache last event time value to avoid super expensive LINQ

This commit is contained in:
Dean Herbert 2021-05-04 16:48:13 +09:00
parent b380be7169
commit 18779b1d1e
1 changed files with 17 additions and 20 deletions

View File

@ -20,6 +20,13 @@ public class DrawableStoryboard : Container<DrawableStoryboardLayer>
[Cached]
public Storyboard Storyboard { get; }
/// <summary>
/// Whether the storyboard is considered finished.
/// </summary>
public IBindable<bool> HasStoryboardEnded => hasStoryboardEnded;
private readonly BindableBool hasStoryboardEnded = new BindableBool();
protected override Container<DrawableStoryboardLayer> Content { get; }
protected override Vector2 DrawScale => new Vector2(Parent.DrawHeight / 480);
@ -40,6 +47,8 @@ public bool Passing
public override bool RemoveCompletedTransforms => false;
private double? lastEventEndTime;
private DependencyContainer dependencies;
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) =>
@ -74,6 +83,14 @@ private void load(FileStore fileStore, GameplayClock clock, CancellationToken? c
Add(layer.CreateDrawable());
}
lastEventEndTime = Storyboard.LatestEventTime;
}
protected override void Update()
{
base.Update();
hasStoryboardEnded.Value = lastEventEndTime == null || Time.Current >= lastEventEndTime;
}
public DrawableStoryboardLayer OverlayLayer => Children.Single(layer => layer.Name == "Overlay");
@ -83,25 +100,5 @@ private void updateLayerVisibility()
foreach (var layer in Children)
layer.Enabled = passing ? layer.Layer.VisibleWhenPassing : layer.Layer.VisibleWhenFailing;
}
protected override void Update()
{
base.Update();
updateHasStoryboardEnded();
}
/// <summary>
/// Whether the storyboard is considered finished.
/// </summary>
public IBindable<bool> HasStoryboardEnded => hasStoryboardEnded;
private readonly BindableBool hasStoryboardEnded = new BindableBool();
private void updateHasStoryboardEnded()
{
hasStoryboardEnded.Value =
Storyboard.LatestEventTime == null ||
Time.Current >= Storyboard.LatestEventTime;
}
}
}