Avoid or reduce LINQ allocations required in various areas.
This commit is contained in:
@@ -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 };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user