diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index cb0ffdfbb6..05d65b9777 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -110,7 +110,7 @@ namespace OpenRA readonly IDefaultVisibility defaultVisibility; readonly INotifyBecomingIdle[] becomingIdles; readonly INotifyIdle[] tickIdles; - readonly ITargetablePositions[] targetablePositions; + readonly IEnumerable enabledTargetablePositions; WPos[] staticTargetablePositions; bool created; @@ -166,7 +166,8 @@ namespace OpenRA becomingIdles = TraitsImplementing().ToArray(); tickIdles = TraitsImplementing().ToArray(); Targetables = TraitsImplementing().ToArray(); - targetablePositions = TraitsImplementing().ToArray(); + var targetablePositions = TraitsImplementing().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 }; } diff --git a/OpenRA.Game/Graphics/SpriteFont.cs b/OpenRA.Game/Graphics/SpriteFont.cs index a00bc4ad90..06829426e0 100644 --- a/OpenRA.Game/Graphics/SpriteFont.cs +++ b/OpenRA.Game/Graphics/SpriteFont.cs @@ -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 lineWidth) + { + var maxWidth = 0f; + foreach (var line in lines) + maxWidth = Math.Max(maxWidth, lineWidth(line)); + return maxWidth; } GlyphInfo CreateGlyph(char c) diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index 62862b55eb..bcab3f2bf3 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -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 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; } } diff --git a/OpenRA.Mods.Common/Traits/CapturableProgressBlink.cs b/OpenRA.Mods.Common/Traits/CapturableProgressBlink.cs index 6bcb5e8c2c..769db7a34a 100644 --- a/OpenRA.Mods.Common/Traits/CapturableProgressBlink.cs +++ b/OpenRA.Mods.Common/Traits/CapturableProgressBlink.cs @@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits if (IsTraitDisabled) return; - if (!captorOwners.Any()) + if (captorOwners.Count == 0) { tick = 0; return; diff --git a/OpenRA.Mods.Common/Traits/CreatesShroud.cs b/OpenRA.Mods.Common/Traits/CreatesShroud.cs index f24af5f462..00527332cb 100644 --- a/OpenRA.Mods.Common/Traits/CreatesShroud.cs +++ b/OpenRA.Mods.Common/Traits/CreatesShroud.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using System.Linq; using OpenRA.Traits; @@ -25,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits public class CreatesShroud : AffectsShroud { readonly CreatesShroudInfo info; - ICreatesShroudModifier[] rangeModifiers; + IEnumerable rangeModifiers; public CreatesShroud(Actor self, CreatesShroudInfo info) : base(self, info) @@ -37,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits { base.Created(self); - rangeModifiers = self.TraitsImplementing().ToArray(); + rangeModifiers = self.TraitsImplementing().ToArray().Select(x => x.GetCreatesShroudModifier()); } protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) @@ -57,8 +58,7 @@ namespace OpenRA.Mods.Common.Traits if (CachedTraitDisabled) return WDist.Zero; - var revealsShroudModifier = rangeModifiers.Select(x => x.GetCreatesShroudModifier()); - var range = Util.ApplyPercentageModifiers(Info.Range.Length, revealsShroudModifier); + var range = Util.ApplyPercentageModifiers(Info.Range.Length, rangeModifiers); return new WDist(range); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingRepairDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingRepairDecoration.cs index 1ffa59a1df..fb6a682a89 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingRepairDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingRepairDecoration.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits.Render protected override bool ShouldRender(Actor self) { - if (!rb.Repairers.Any()) + if (rb.Repairers.Count == 0) return false; return base.ShouldRender(self); diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs index e391a116ea..1cb034d47a 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs @@ -106,8 +106,10 @@ namespace OpenRA.Mods.Common.Traits.Render if (!Info.Recoils) return t.Position(self); - var recoilDist = arms.Aggregate(WDist.Zero, (a, b) => a + b.Recoil); - var recoil = new WVec(-recoilDist, WDist.Zero, WDist.Zero); + var recoilDist = 0; + 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)); } diff --git a/OpenRA.Mods.Common/Traits/RevealsShroud.cs b/OpenRA.Mods.Common/Traits/RevealsShroud.cs index 6ea9c50020..b86dc3ad56 100644 --- a/OpenRA.Mods.Common/Traits/RevealsShroud.cs +++ b/OpenRA.Mods.Common/Traits/RevealsShroud.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using System.Linq; using OpenRA.Traits; @@ -29,7 +30,7 @@ namespace OpenRA.Mods.Common.Traits { readonly RevealsShroudInfo info; readonly Shroud.SourceType type; - IRevealsShroudModifier[] rangeModifiers; + IEnumerable rangeModifiers; public RevealsShroud(Actor self, RevealsShroudInfo info) : base(self, info) @@ -43,7 +44,7 @@ namespace OpenRA.Mods.Common.Traits { base.Created(self); - rangeModifiers = self.TraitsImplementing().ToArray(); + rangeModifiers = self.TraitsImplementing().ToArray().Select(x => x.GetRevealsShroudModifier()); } protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) @@ -63,8 +64,7 @@ namespace OpenRA.Mods.Common.Traits if (CachedTraitDisabled) return WDist.Zero; - var revealsShroudModifier = rangeModifiers.Select(x => x.GetRevealsShroudModifier()); - var range = Util.ApplyPercentageModifiers(Info.Range.Length, revealsShroudModifier); + var range = Util.ApplyPercentageModifiers(Info.Range.Length, rangeModifiers); return new WDist(range); } } diff --git a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs index e0f7e23ed6..bc19a7ded7 100644 --- a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs @@ -249,7 +249,8 @@ namespace OpenRA.Mods.Common.Widgets 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); if (Contrast) font.DrawTextWithContrast(text, position + stateOffset,