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.
This commit is contained in:
RoosterDragon
2014-12-07 21:36:56 +00:00
parent 51f874fae2
commit 1116f578a3

View File

@@ -175,15 +175,17 @@ namespace OpenRA.Traits
var right = (r.Right / info.BinSize).Clamp(0, cols - 1); var right = (r.Right / info.BinSize).Clamp(0, cols - 1);
var top = (r.Top / info.BinSize).Clamp(0, rows - 1); var top = (r.Top / info.BinSize).Clamp(0, rows - 1);
var bottom = (r.Bottom / info.BinSize).Clamp(0, rows - 1); var bottom = (r.Bottom / info.BinSize).Clamp(0, rows - 1);
var bins = frozen[p];
var frozenInBox = new List<FrozenActor>(); var actorsChecked = new HashSet<FrozenActor>();
for (var j = top; j <= bottom; j++) for (var j = top; j <= bottom; j++)
for (var i = left; i <= right; i++) for (var i = left; i <= right; i++)
frozenInBox.AddRange(frozen[p][j * cols + i] foreach (var kvp in bins[j * cols + i])
.Where(kv => kv.Key.IsValid && kv.Value.IntersectsWith(r)) {
.Select(kv => kv.Key)); var actor = kvp.Key;
if (actor.IsValid && kvp.Value.IntersectsWith(r) && actorsChecked.Add(actor))
return frozenInBox.Distinct(); yield return actor;
}
} }
} }
} }