Avoid or reduce LINQ allocations required in various areas.

This commit is contained in:
RoosterDragon
2020-10-11 11:46:39 +01:00
committed by abcdefg30
parent da53d5b776
commit bb116034c7
9 changed files with 31 additions and 24 deletions

View File

@@ -110,7 +110,7 @@ namespace OpenRA
readonly IDefaultVisibility defaultVisibility;
readonly INotifyBecomingIdle[] becomingIdles;
readonly INotifyIdle[] tickIdles;
readonly ITargetablePositions[] targetablePositions;
readonly IEnumerable<ITargetablePositions> enabledTargetablePositions;
WPos[] staticTargetablePositions;
bool created;
@@ -166,7 +166,8 @@ namespace OpenRA
becomingIdles = TraitsImplementing<INotifyBecomingIdle>().ToArray();
tickIdles = TraitsImplementing<INotifyIdle>().ToArray();
Targetables = TraitsImplementing<ITargetable>().ToArray();
targetablePositions = TraitsImplementing<ITargetablePositions>().ToArray();
var targetablePositions = TraitsImplementing<ITargetablePositions>().ToArray();
enabledTargetablePositions = targetablePositions.Where(Exts.IsTraitEnabled);
world.AddFrameEndTask(w =>
{
// Caching this in a AddFrameEndTask, because trait construction order might cause problems if done directly at creation time.
@@ -515,9 +516,8 @@ namespace OpenRA
if (staticTargetablePositions != null)
return staticTargetablePositions;
var enabledTargetablePositionTraits = targetablePositions.Where(Exts.IsTraitEnabled);
if (enabledTargetablePositionTraits.Any())
return enabledTargetablePositionTraits.SelectMany(tp => tp.TargetablePositions(this));
if (enabledTargetablePositions.Any())
return enabledTargetablePositions.SelectMany(tp => tp.TargetablePositions(this));
return new[] { CenterPosition };
}

View File

@@ -239,7 +239,15 @@ namespace OpenRA.Graphics
return new int2(0, size);
var lines = text.Split('\n');
return new int2((int)Math.Ceiling(lines.Max(lineWidth)), lines.Length * size);
return new int2((int)Math.Ceiling(MaxLineWidth(lines, lineWidth)), lines.Length * size);
}
static float MaxLineWidth(string[] lines, Func<string, float> lineWidth)
{
var maxWidth = 0f;
foreach (var line in lines)
maxWidth = Math.Max(maxWidth, lineWidth(line));
return maxWidth;
}
GlyphInfo CreateGlyph(char c)

View File

@@ -1282,16 +1282,12 @@ namespace OpenRA
throw new ArgumentOutOfRangeException("maxRange",
"The requested range ({0}) cannot exceed the value of MaximumTileSearchRange ({1})".F(maxRange, Grid.MaximumTileSearchRange));
Func<CPos, bool> valid = Contains;
if (allowOutsideBounds)
valid = Tiles.Contains;
for (var i = minRange; i <= maxRange; i++)
{
foreach (var offset in Grid.TilesByDistance[i])
{
var t = offset + center;
if (valid(t))
if (allowOutsideBounds ? Tiles.Contains(t) : Contains(t))
yield return t;
}
}