Tackle the last of the low hanging fruit for memory allocations in the main game loop.

- Avoid calling string.Split twice in SprintFont.Measure.
- Change ActorsInBox method of ActorMap and ScreenMap to avoid allocating and intermediate list. As a bonus this allows the sequence to be lazily consumed. Also avoid LINQ in these methods.
- In FrozenUnderFog.TickRender, the method exits early if no players are visible so the attempt at lazy generation was not needed.
- Unwrap a LINQ Any call in ClassicProductionQueue.Tick.
- Merge some successive Where calls in ProximityCapturable into single predicates.
This commit is contained in:
RoosterDragon
2014-06-21 01:31:19 +01:00
parent a5d765e100
commit 8a60880cf1
6 changed files with 33 additions and 38 deletions

View File

@@ -189,21 +189,22 @@ namespace OpenRA.Traits
var j1 = (top / info.BinSize).Clamp(0, rows - 1);
var j2 = (bottom / info.BinSize).Clamp(0, rows - 1);
var actorsInBox = new List<Actor>();
var actorsChecked = new HashSet<Actor>();
for (var j = j1; j <= j2; j++)
{
for (var i = i1; i <= i2; i++)
{
foreach (var actor in actors[j * cols + i])
{
var c = actor.CenterPosition;
if (actor.IsInWorld && left <= c.X && c.X <= right && top <= c.Y && c.Y <= bottom)
actorsInBox.Add(actor);
if (actor.IsInWorld && actorsChecked.Add(actor))
{
var c = actor.CenterPosition;
if (left <= c.X && c.X <= right && top <= c.Y && c.Y <= bottom)
yield return actor;
}
}
}
}
return actorsInBox.Distinct();
}
}
}