When a render method has nothing to render, eagerly return.
By eagerly returning an empty enumerable in these cases, this avoids allocating an enumerable for the whole render method if nothing will be drawn.
This commit is contained in:
@@ -55,13 +55,18 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
IEnumerable<IRenderable> IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (debugVis == null || !debugVis.CombatGeometry || self.World.FogObscures(self))
|
if (debugVis == null || !debugVis.CombatGeometry || self.World.FogObscures(self))
|
||||||
yield break;
|
return Enumerable.Empty<IRenderable>();
|
||||||
|
|
||||||
|
return RenderAnnotations(self, wr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> RenderAnnotations(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
var blockers = allBlockers.Where(Exts.IsTraitEnabled).ToList();
|
var blockers = allBlockers.Where(Exts.IsTraitEnabled).ToList();
|
||||||
if (blockers.Count > 0)
|
if (blockers.Count > 0)
|
||||||
{
|
{
|
||||||
var height = new WVec(0, 0, blockers.Max(b => b.BlockingHeight.Length));
|
var height = new WVec(0, 0, blockers.Max(b => b.BlockingHeight.Length));
|
||||||
yield return new LineAnnotationRenderable(self.CenterPosition, self.CenterPosition + height, 1, Color.Orange);
|
yield return new LineAnnotationRenderable(self.CenterPosition, self.CenterPosition + height, 1, Color.Orange);
|
||||||
}
|
}
|
||||||
|
|
||||||
var activeShapes = shapes.Where(Exts.IsTraitEnabled);
|
var activeShapes = shapes.Where(Exts.IsTraitEnabled);
|
||||||
|
|||||||
@@ -90,8 +90,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
IEnumerable<WPos> ITargetablePositions.TargetablePositions(Actor self)
|
IEnumerable<WPos> ITargetablePositions.TargetablePositions(Actor self)
|
||||||
{
|
{
|
||||||
if (IsTraitDisabled)
|
if (IsTraitDisabled)
|
||||||
yield break;
|
return Enumerable.Empty<WPos>();
|
||||||
|
|
||||||
|
return TargetablePositions(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerable<WPos> TargetablePositions(Actor self)
|
||||||
|
{
|
||||||
if (Info.UseTargetableCellsOffsets && targetableCells != null)
|
if (Info.UseTargetableCellsOffsets && targetableCells != null)
|
||||||
foreach (var c in targetableCells.TargetableCells())
|
foreach (var c in targetableCells.TargetableCells())
|
||||||
yield return self.World.Map.CenterOfCell(c.Cell);
|
yield return self.World.Map.CenterOfCell(c.Cell);
|
||||||
|
|||||||
@@ -63,17 +63,27 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
ShowTargetLines(self);
|
ShowTargetLines(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr)
|
bool ShouldRender(Actor self)
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.LocalPlayer) || Game.Settings.Game.TargetLines == TargetLinesType.Disabled)
|
if (!self.Owner.IsAlliedWith(self.World.LocalPlayer) || Game.Settings.Game.TargetLines == TargetLinesType.Disabled)
|
||||||
yield break;
|
return false;
|
||||||
|
|
||||||
// Players want to see the lines when in waypoint mode.
|
// Players want to see the lines when in waypoint mode.
|
||||||
var force = Game.GetModifierKeys().HasModifier(Modifiers.Shift) || self.World.OrderGenerator is ForceModifiersOrderGenerator;
|
var force = Game.GetModifierKeys().HasModifier(Modifiers.Shift) || self.World.OrderGenerator is ForceModifiersOrderGenerator;
|
||||||
|
|
||||||
if (Game.RunTime > lifetime && !force)
|
return force || Game.RunTime <= lifetime;
|
||||||
yield break;
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
if (!ShouldRender(self))
|
||||||
|
return Enumerable.Empty<IRenderable>();
|
||||||
|
|
||||||
|
return RenderAboveShroud(self, wr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||||
var a = self.CurrentActivity;
|
var a = self.CurrentActivity;
|
||||||
for (; a != null; a = a.NextActivity)
|
for (; a != null; a = a.NextActivity)
|
||||||
@@ -87,13 +97,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
IEnumerable<IRenderable> IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.LocalPlayer) || Game.Settings.Game.TargetLines == TargetLinesType.Disabled)
|
if (!ShouldRender(self))
|
||||||
return Enumerable.Empty<IRenderable>();
|
|
||||||
|
|
||||||
// Players want to see the lines when in waypoint mode.
|
|
||||||
var force = Game.GetModifierKeys().HasModifier(Modifiers.Shift) || self.World.OrderGenerator is ForceModifiersOrderGenerator;
|
|
||||||
|
|
||||||
if (Game.RunTime > lifetime && !force)
|
|
||||||
return Enumerable.Empty<IRenderable>();
|
return Enumerable.Empty<IRenderable>();
|
||||||
|
|
||||||
renderableCache.Clear();
|
renderableCache.Clear();
|
||||||
@@ -108,8 +112,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
if (n.Target.Type != TargetType.Invalid && n.Tile == null)
|
if (n.Target.Type != TargetType.Invalid && n.Tile == null)
|
||||||
{
|
{
|
||||||
var lineWidth = renderableCache.Any() ? info.QueuedLineWidth : info.LineWidth;
|
var lineWidth = renderableCache.Count > 0 ? info.QueuedLineWidth : info.LineWidth;
|
||||||
var markerWidth = renderableCache.Any() ? info.QueuedMarkerWidth : info.MarkerWidth;
|
var markerWidth = renderableCache.Count > 0 ? info.QueuedMarkerWidth : info.MarkerWidth;
|
||||||
|
|
||||||
var pos = n.Target.CenterPosition;
|
var pos = n.Target.CenterPosition;
|
||||||
renderableCache.Add(new TargetLineRenderable(new[] { prev, pos }, n.Color, lineWidth, markerWidth));
|
renderableCache.Add(new TargetLineRenderable(new[] { prev, pos }, n.Color, lineWidth, markerWidth));
|
||||||
@@ -118,9 +122,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (renderableCache.Count == 0)
|
||||||
|
return Enumerable.Empty<IRenderable>();
|
||||||
|
|
||||||
// Reverse draw order so target markers are drawn on top of the next line
|
// Reverse draw order so target markers are drawn on top of the next line
|
||||||
renderableCache.Reverse();
|
renderableCache.Reverse();
|
||||||
return renderableCache;
|
return renderableCache.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IRenderAnnotationsWhenSelected.SpatiallyPartitionable { get { return false; } }
|
bool IRenderAnnotationsWhenSelected.SpatiallyPartitionable { get { return false; } }
|
||||||
|
|||||||
Reference in New Issue
Block a user