From c2867cd9e5c83bd301825fb0997cbaca2e7b49ad Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:20:55 +1000 Subject: [PATCH] Reduce do_after allocations (#7439) --- Content.Client/DoAfter/DoAfterSystem.cs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Content.Client/DoAfter/DoAfterSystem.cs b/Content.Client/DoAfter/DoAfterSystem.cs index 31315ab86c..c28b79a664 100644 --- a/Content.Client/DoAfter/DoAfterSystem.cs +++ b/Content.Client/DoAfter/DoAfterSystem.cs @@ -175,9 +175,7 @@ namespace Content.Client.DoAfter /// Mark a DoAfter as cancelled and show a cancellation graphic. /// /// Actual removal is handled by DoAfterEntitySystem. - /// - /// - public void Cancel(DoAfterComponent component, byte id, TimeSpan? currentTime = null) + public void Cancel(DoAfterComponent component, byte id) { foreach (var (_, cancelled) in component.CancelledDoAfters) { @@ -204,7 +202,7 @@ namespace Content.Client.DoAfter return; // ReSharper disable once ConvertToLocalFunction - var predicate = (EntityUid uid, (EntityUid compOwner, EntityUid? attachedEntity) data) + var predicate = static (EntityUid uid, (EntityUid compOwner, EntityUid? attachedEntity) data) => uid == data.compOwner || uid == data.attachedEntity; var viewbox = _eyeManager.GetWorldViewport().Enlarged(2.0f); @@ -213,7 +211,7 @@ namespace Content.Client.DoAfter foreach (var (comp, xform) in EntityManager.EntityQuery(true)) { - var doAfters = comp.DoAfters.ToList(); + var doAfters = comp.DoAfters; var compPos = xform.MapPosition; if (doAfters.Count == 0 || @@ -239,6 +237,7 @@ namespace Content.Client.DoAfter Enable(comp); var userGrid = xform.Coordinates; + var toRemove = new RemQueue(); // Check cancellations / finishes foreach (var (id, doAfter) in doAfters) @@ -248,7 +247,7 @@ namespace Content.Client.DoAfter // If we've passed the final time (after the excess to show completion graphic) then remove. if (elapsedTime > doAfter.Delay + ExcessTime) { - Remove(comp, doAfter); + toRemove.Add(doAfter); continue; } @@ -261,7 +260,7 @@ namespace Content.Client.DoAfter { if (!userGrid.InRange(EntityManager, doAfter.UserGrid, doAfter.MovementThreshold)) { - Cancel(comp, id, currentTime); + Cancel(comp, id); continue; } } @@ -272,12 +271,17 @@ namespace Content.Client.DoAfter !Transform(doAfter.Target.Value).Coordinates.InRange(EntityManager, doAfter.TargetGrid, doAfter.MovementThreshold)) { - Cancel(comp, id, currentTime); + Cancel(comp, id); continue; } } } + foreach (var doAfter in toRemove) + { + Remove(comp, doAfter); + } + var count = comp.CancelledDoAfters.Count; // Remove cancelled DoAfters after ExcessTime has elapsed for (var i = count - 1; i >= 0; i--)