From 1116f578a3fdd3b3ac64c38b3afe7e46be704aac Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 7 Dec 2014 21:36:56 +0000 Subject: [PATCH] Make FrozenActorsInBox a streaming enumerable. Following the same layout as ActorsInBox, this streams the enumerable internally making it cheaper to call if only part of it is required, and also avoids building an intermediate list. --- OpenRA.Game/Traits/World/ScreenMap.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Traits/World/ScreenMap.cs b/OpenRA.Game/Traits/World/ScreenMap.cs index c656e098b7..96f239a6c5 100755 --- a/OpenRA.Game/Traits/World/ScreenMap.cs +++ b/OpenRA.Game/Traits/World/ScreenMap.cs @@ -175,15 +175,17 @@ namespace OpenRA.Traits var right = (r.Right / info.BinSize).Clamp(0, cols - 1); var top = (r.Top / info.BinSize).Clamp(0, rows - 1); var bottom = (r.Bottom / info.BinSize).Clamp(0, rows - 1); + var bins = frozen[p]; - var frozenInBox = new List(); + var actorsChecked = new HashSet(); for (var j = top; j <= bottom; j++) for (var i = left; i <= right; i++) - frozenInBox.AddRange(frozen[p][j * cols + i] - .Where(kv => kv.Key.IsValid && kv.Value.IntersectsWith(r)) - .Select(kv => kv.Key)); - - return frozenInBox.Distinct(); + foreach (var kvp in bins[j * cols + i]) + { + var actor = kvp.Key; + if (actor.IsValid && kvp.Value.IntersectsWith(r) && actorsChecked.Add(actor)) + yield return actor; + } } } }