Remove LINQ in some performance critical AutoTarget paths.

This commit is contained in:
RoosterDragon
2015-10-17 00:51:45 +01:00
parent dcf375a412
commit 0fab3ec1b2
3 changed files with 45 additions and 13 deletions

View File

@@ -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;
}
/// <summary>Checks if the weapon is valid against (can target) the frozen actor.</summary>

View File

@@ -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

View File

@@ -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