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

View File

@@ -239,7 +239,15 @@ namespace OpenRA.Graphics
return new int2(0, size); return new int2(0, size);
var lines = text.Split('\n'); 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) GlyphInfo CreateGlyph(char c)

View File

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

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits
if (IsTraitDisabled) if (IsTraitDisabled)
return; return;
if (!captorOwners.Any()) if (captorOwners.Count == 0)
{ {
tick = 0; tick = 0;
return; return;

View File

@@ -9,6 +9,7 @@
*/ */
#endregion #endregion
using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Traits; using OpenRA.Traits;
@@ -25,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public class CreatesShroud : AffectsShroud public class CreatesShroud : AffectsShroud
{ {
readonly CreatesShroudInfo info; readonly CreatesShroudInfo info;
ICreatesShroudModifier[] rangeModifiers; IEnumerable<int> rangeModifiers;
public CreatesShroud(Actor self, CreatesShroudInfo info) public CreatesShroud(Actor self, CreatesShroudInfo info)
: base(self, info) : base(self, info)
@@ -37,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
base.Created(self); base.Created(self);
rangeModifiers = self.TraitsImplementing<ICreatesShroudModifier>().ToArray(); rangeModifiers = self.TraitsImplementing<ICreatesShroudModifier>().ToArray().Select(x => x.GetCreatesShroudModifier());
} }
protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv)
@@ -57,8 +58,7 @@ namespace OpenRA.Mods.Common.Traits
if (CachedTraitDisabled) if (CachedTraitDisabled)
return WDist.Zero; return WDist.Zero;
var revealsShroudModifier = rangeModifiers.Select(x => x.GetCreatesShroudModifier()); var range = Util.ApplyPercentageModifiers(Info.Range.Length, rangeModifiers);
var range = Util.ApplyPercentageModifiers(Info.Range.Length, revealsShroudModifier);
return new WDist(range); return new WDist(range);
} }
} }

View File

@@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits.Render
protected override bool ShouldRender(Actor self) protected override bool ShouldRender(Actor self)
{ {
if (!rb.Repairers.Any()) if (rb.Repairers.Count == 0)
return false; return false;
return base.ShouldRender(self); return base.ShouldRender(self);

View File

@@ -106,8 +106,10 @@ namespace OpenRA.Mods.Common.Traits.Render
if (!Info.Recoils) if (!Info.Recoils)
return t.Position(self); return t.Position(self);
var recoilDist = arms.Aggregate(WDist.Zero, (a, b) => a + b.Recoil); var recoilDist = 0;
var recoil = new WVec(-recoilDist, WDist.Zero, WDist.Zero); foreach (var arm in arms)
recoilDist += arm.Recoil.Length;
var recoil = new WVec(new WDist(-recoilDist), WDist.Zero, WDist.Zero);
return t.Position(self) + body.LocalToWorld(recoil.Rotate(t.WorldOrientation)); return t.Position(self) + body.LocalToWorld(recoil.Rotate(t.WorldOrientation));
} }

View File

@@ -9,6 +9,7 @@
*/ */
#endregion #endregion
using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Traits; using OpenRA.Traits;
@@ -29,7 +30,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
readonly RevealsShroudInfo info; readonly RevealsShroudInfo info;
readonly Shroud.SourceType type; readonly Shroud.SourceType type;
IRevealsShroudModifier[] rangeModifiers; IEnumerable<int> rangeModifiers;
public RevealsShroud(Actor self, RevealsShroudInfo info) public RevealsShroud(Actor self, RevealsShroudInfo info)
: base(self, info) : base(self, info)
@@ -43,7 +44,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
base.Created(self); base.Created(self);
rangeModifiers = self.TraitsImplementing<IRevealsShroudModifier>().ToArray(); rangeModifiers = self.TraitsImplementing<IRevealsShroudModifier>().ToArray().Select(x => x.GetRevealsShroudModifier());
} }
protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv)
@@ -63,8 +64,7 @@ namespace OpenRA.Mods.Common.Traits
if (CachedTraitDisabled) if (CachedTraitDisabled)
return WDist.Zero; return WDist.Zero;
var revealsShroudModifier = rangeModifiers.Select(x => x.GetRevealsShroudModifier()); var range = Util.ApplyPercentageModifiers(Info.Range.Length, rangeModifiers);
var range = Util.ApplyPercentageModifiers(Info.Range.Length, revealsShroudModifier);
return new WDist(range); return new WDist(range);
} }
} }

View File

@@ -249,7 +249,8 @@ namespace OpenRA.Mods.Common.Widgets
var position = GetTextPosition(text, font, rb); var position = GetTextPosition(text, font, rb);
var hover = Ui.MouseOverWidget == this || Children.Any(c => c == Ui.MouseOverWidget); // PERF: Avoid LINQ by using Children.Find(...) != null instead of Children.Any(...)
var hover = Ui.MouseOverWidget == this || Children.Find(c => c == Ui.MouseOverWidget) != null;
DrawBackground(rb, disabled, Depressed, hover, highlighted); DrawBackground(rb, disabled, Depressed, hover, highlighted);
if (Contrast) if (Contrast)
font.DrawTextWithContrast(text, position + stateOffset, font.DrawTextWithContrast(text, position + stateOffset,