From 0fab3ec1b25c319b74a23ef88f11d511e3d1917b Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sat, 17 Oct 2015 00:51:45 +0100 Subject: [PATCH] Remove LINQ in some performance critical AutoTarget paths. --- OpenRA.Game/GameRules/WeaponInfo.cs | 7 ++-- OpenRA.Game/Player.cs | 18 ++++++++-- .../Traits/Attack/AttackBase.cs | 33 +++++++++++++++---- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index 3e6591f985..8cfba690e6 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -132,10 +132,11 @@ namespace OpenRA.GameRules if (!IsValidTarget(targetTypes)) return false; - if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy))) - return false; + foreach (var warhead in Warheads) + if (warhead.IsValidAgainst(victim, firedBy)) + return true; - return true; + return false; } /// Checks if the weapon is valid against (can target) the frozen actor. diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index f53e9a0895..cc427806ac 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -159,13 +159,25 @@ namespace OpenRA public bool CanTargetActor(Actor a) { - if (HasFogVisibility && fogVisibilities.Any(f => f.IsVisible(a))) - return true; + if (HasFogVisibility) + foreach (var fogVisibility in fogVisibilities) + if (fogVisibility.IsVisible(a)) + return true; return CanViewActor(a); } - public bool HasFogVisibility { get { return fogVisibilities.Any(f => f.HasFogVisibility()); } } + public bool HasFogVisibility + { + get + { + foreach (var fogVisibility in fogVisibilities) + if (fogVisibility.HasFogVisibility()) + return true; + + return false; + } + } #region Scripting interface diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 9fe9105413..8acfa94f73 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -189,7 +189,11 @@ namespace OpenRA.Mods.Common.Traits if (Info.AttackRequiresEnteringCell && !positionable.Value.CanEnterCell(t.Actor.Location, null, false)) return false; - return Armaments.Any(a => a.Weapon.IsValidAgainst(t, self.World, self)); + foreach (var armament in Armaments) + if (armament.Weapon.IsValidAgainst(t, self.World, self)) + return true; + + return false; } public WDist GetMinimumRange() @@ -197,9 +201,16 @@ namespace OpenRA.Mods.Common.Traits if (IsTraitDisabled) return WDist.Zero; - var min = Armaments.Where(a => !a.IsTraitDisabled) - .Select(a => a.Weapon.MinRange) - .Append(WDist.MaxValue).Min(); + var min = WDist.MaxValue; + foreach (var armament in Armaments) + { + if (armament.IsTraitDisabled) + continue; + var range = armament.Weapon.MinRange; + if (min > range) + min = range; + } + return min != WDist.MaxValue ? min : WDist.Zero; } @@ -208,9 +219,17 @@ namespace OpenRA.Mods.Common.Traits if (IsTraitDisabled) return WDist.Zero; - return Armaments.Where(a => !a.IsTraitDisabled) - .Select(a => a.MaxRange()) - .Append(WDist.Zero).Max(); + var max = WDist.Zero; + foreach (var armament in Armaments) + { + if (armament.IsTraitDisabled) + continue; + var range = armament.MaxRange(); + if (max < range) + max = range; + } + + return max; } // Enumerates all armaments, that this actor possesses, that can be used against Target t