Checked LINQ queries and collections for inefficiencies.
- Made Array.IndexOf available via extension method. - Made ToHashSet extension method. - Change collections queried often via Contains into sets. - Avoid Count() extension if Count or Length property exist. - Made Count() > 0 checks and variations calls to Any() instead. - Don't call ToList/ToArray if there is no benefit to materializing the sequence. - If the sequence does benefit from materialization, follow this general pattern: - Collection queried often via Contains use ToHashSet to speed up lookups. - Short lived variables use ToList. This is because ToArray requires an extra copy to output the final size. - Collections persisted into fields or for a long time use ToArray to minimize memory overhead.
This commit is contained in:
committed by
RoosterDragon
parent
f5f3747338
commit
82bea961ba
@@ -218,7 +218,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (!buildableThings.Any())
|
||||
return null;
|
||||
|
||||
var unit = buildableThings.ElementAtOrDefault(Random.Next(buildableThings.Count()));
|
||||
var unit = buildableThings.Random(Random);
|
||||
return HasAdequateAirUnits(unit) ? unit : null;
|
||||
}
|
||||
|
||||
@@ -231,11 +231,11 @@ namespace OpenRA.Mods.RA.AI
|
||||
var myUnits = Player.World
|
||||
.ActorsWithTrait<IPositionable>()
|
||||
.Where(a => a.Actor.Owner == Player)
|
||||
.Select(a => a.Actor.Info.Name).ToArray();
|
||||
.Select(a => a.Actor.Info.Name).ToList();
|
||||
|
||||
foreach (var unit in Info.UnitsToBuild.Shuffle(Random))
|
||||
if (buildableThings.Any(b => b.Name == unit.Key))
|
||||
if (myUnits.Count(a => a == unit.Key) < unit.Value * myUnits.Length)
|
||||
if (myUnits.Count(a => a == unit.Key) < unit.Value * myUnits.Count)
|
||||
if (HasAdequateAirUnits(Map.Rules.Actors[unit.Key]))
|
||||
return Map.Rules.Actors[unit.Key];
|
||||
|
||||
@@ -463,12 +463,9 @@ namespace OpenRA.Mods.RA.AI
|
||||
{
|
||||
var enemyUnits = World.FindActorsInCircle(pos, radius)
|
||||
.Where(unit => Player.Stances[unit.Owner] == Stance.Enemy &&
|
||||
!unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList();
|
||||
!unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>());
|
||||
|
||||
if (enemyUnits.Count > 0)
|
||||
return enemyUnits.ClosestTo(pos);
|
||||
|
||||
return null;
|
||||
return enemyUnits.ClosestTo(pos);
|
||||
}
|
||||
|
||||
List<Actor> FindEnemyConstructionYards()
|
||||
@@ -645,7 +642,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
{
|
||||
var ownUnits = World.FindActorsInCircle(World.Map.CenterOfCell(BaseCenter), WRange.FromCells(Info.ProtectUnitScanRadius))
|
||||
.Where(unit => unit.Owner == Player && !unit.HasTrait<Building>()
|
||||
&& unit.HasTrait<AttackBase>()).ToList();
|
||||
&& unit.HasTrait<AttackBase>());
|
||||
|
||||
foreach (var a in ownUnits)
|
||||
protectSq.Units.Add(a);
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (leader == null)
|
||||
return;
|
||||
var ownUnits = owner.World.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(owner.Units.Count) / 3)
|
||||
.Where(a => a.Owner == owner.Units.FirstOrDefault().Owner && owner.Units.Contains(a)).ToList();
|
||||
.Where(a => a.Owner == owner.Units.FirstOrDefault().Owner && owner.Units.Contains(a)).ToHashSet();
|
||||
if (ownUnits.Count < owner.Units.Count)
|
||||
{
|
||||
owner.World.IssueOrder(new Order("Stop", leader, false));
|
||||
@@ -94,11 +94,12 @@ namespace OpenRA.Mods.RA.AI
|
||||
else
|
||||
{
|
||||
var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(12))
|
||||
.Where(a1 => !a1.Destroyed && !a1.IsDead).ToList();
|
||||
var enemynearby = enemies.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList();
|
||||
if (enemynearby.Any())
|
||||
.Where(a1 => !a1.Destroyed && !a1.IsDead);
|
||||
var enemynearby = enemies.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy);
|
||||
var target = enemynearby.ClosestTo(leader.CenterPosition);
|
||||
if (target != null)
|
||||
{
|
||||
owner.TargetActor = enemynearby.ClosestTo(leader.CenterPosition);
|
||||
owner.TargetActor = target;
|
||||
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackState(), true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ namespace OpenRA.Mods.RA.AI
|
||||
{
|
||||
var location = squad.Bot.BaseCenter;
|
||||
var buildings = squad.World.ActorsWithTrait<Building>()
|
||||
.Where(a => a.Actor.Owner == squad.Bot.Player).Select(a => a.Actor).ToArray();
|
||||
if (buildings.Length > 0)
|
||||
.Where(a => a.Actor.Owner == squad.Bot.Player).Select(a => a.Actor).ToList();
|
||||
if (buildings.Count > 0)
|
||||
location = buildings.Random(squad.Random).Location;
|
||||
return location;
|
||||
}
|
||||
|
||||
@@ -95,9 +95,9 @@ namespace OpenRA.Mods.RA.Traits
|
||||
paxFacing.Add(passenger, passenger.Trait<IFacing>());
|
||||
paxPos.Add(passenger, passenger.Trait<IPositionable>());
|
||||
paxRender.Add(passenger, passenger.Trait<RenderSprites>());
|
||||
armaments = armaments.Append(passenger.TraitsImplementing<Armament>()
|
||||
.Where(a => info.Armaments.Contains(a.Info.Name))
|
||||
.ToArray()).ToList();
|
||||
armaments.AddRange(
|
||||
passenger.TraitsImplementing<Armament>()
|
||||
.Where(a => info.Armaments.Contains(a.Info.Name)));
|
||||
}
|
||||
|
||||
public void PassengerExited(Actor self, Actor passenger)
|
||||
@@ -189,7 +189,7 @@ namespace OpenRA.Mods.RA.Traits
|
||||
base.Tick(self);
|
||||
|
||||
// Take a copy so that Tick() can remove animations
|
||||
foreach (var m in muzzles.ToList())
|
||||
foreach (var m in muzzles.ToArray())
|
||||
m.Animation.Tick();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,11 +137,8 @@ namespace OpenRA.Mods.RA.Traits
|
||||
return occupancy * 12;
|
||||
}));
|
||||
|
||||
// Reverse the found-path to find the refinery location instead of our location:
|
||||
path.Reverse();
|
||||
|
||||
if (path.Count != 0)
|
||||
return refs[path[0]].Actor;
|
||||
return refs[path.Last()].Actor;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -57,11 +57,11 @@ namespace OpenRA.Mods.RA.Traits
|
||||
{
|
||||
var range = ((ChronoshiftPowerInfo)Info).Range;
|
||||
var tiles = Self.World.Map.FindTilesInCircle(xy, range);
|
||||
var units = new List<Actor>();
|
||||
var units = new HashSet<Actor>();
|
||||
foreach (var t in tiles)
|
||||
units.AddRange(Self.World.ActorMap.GetUnitsAt(t));
|
||||
units.UnionWith(Self.World.ActorMap.GetUnitsAt(t));
|
||||
|
||||
return units.Distinct().Where(a => a.HasTrait<Chronoshiftable>() &&
|
||||
return units.Where(a => a.HasTrait<Chronoshiftable>() &&
|
||||
!a.TraitsImplementing<IPreventsTeleport>().Any(condition => condition.PreventsTeleport(a)));
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
var extractFiles = Game.ModData.Manifest.ContentInstaller.ExtractFilesFromCD;
|
||||
|
||||
var installCounter = 0;
|
||||
var installTotal = copyFiles.Count() + extractFiles.Count();
|
||||
var installTotal = copyFiles.Length + extractFiles.Length;
|
||||
var onProgress = (Action<string>)(s => Game.RunAfterTick(() =>
|
||||
{
|
||||
progressBar.Percentage = installCounter * 100 / installTotal;
|
||||
|
||||
@@ -188,19 +188,19 @@ namespace OpenRA.Mods.RA.Widgets
|
||||
{
|
||||
var bases = world.ActorsWithTrait<BaseBuilding>()
|
||||
.Where(a => a.Actor.Owner == world.LocalPlayer)
|
||||
.ToArray();
|
||||
.Select(b => b.Actor)
|
||||
.ToList();
|
||||
|
||||
if (!bases.Any())
|
||||
return true;
|
||||
|
||||
var next = bases
|
||||
.Select(b => b.Actor)
|
||||
.SkipWhile(b => !world.Selection.Actors.Contains(b))
|
||||
.Skip(1)
|
||||
.FirstOrDefault();
|
||||
|
||||
if (next == null)
|
||||
next = bases.Select(b => b.Actor).First();
|
||||
next = bases.First();
|
||||
|
||||
world.Selection.Combine(world, new Actor[] { next }, false, true);
|
||||
|
||||
@@ -212,19 +212,19 @@ namespace OpenRA.Mods.RA.Widgets
|
||||
var facilities = world.ActorsWithTrait<Production>()
|
||||
.Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.HasTrait<BaseBuilding>())
|
||||
.OrderBy(f => f.Actor.Info.Traits.Get<ProductionInfo>().Produces.First())
|
||||
.ToArray();
|
||||
.Select(b => b.Actor)
|
||||
.ToList();
|
||||
|
||||
if (!facilities.Any())
|
||||
return true;
|
||||
|
||||
var next = facilities
|
||||
.Select(b => b.Actor)
|
||||
.SkipWhile(b => !world.Selection.Actors.Contains(b))
|
||||
.Skip(1)
|
||||
.FirstOrDefault();
|
||||
|
||||
if (next == null)
|
||||
next = facilities.Select(b => b.Actor).First();
|
||||
next = facilities.First();
|
||||
|
||||
world.Selection.Combine(world, new Actor[] { next }, false, true);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user