Skip to content

Commit

Permalink
Merge pull request #8729 from RoosterDragon/alloc-reductions
Browse files Browse the repository at this point in the history
Reduce allocations
  • Loading branch information
pchote committed Jul 18, 2015
2 parents 60792ab + ccad451 commit bea021a
Show file tree
Hide file tree
Showing 14 changed files with 86 additions and 48 deletions.
12 changes: 7 additions & 5 deletions OpenRA.Game/Graphics/LineRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class LineRenderer : Renderer.IBatchRenderer

readonly Renderer renderer;
readonly IShader shader;
readonly Action renderAction;

readonly Vertex[] vertices;
int nv = 0;
Expand All @@ -31,6 +32,11 @@ public LineRenderer(Renderer renderer, IShader shader)
this.renderer = renderer;
this.shader = shader;
vertices = new Vertex[renderer.TempBufferSize];
renderAction = () =>
{
renderer.SetLineWidth(LineWidth);
renderer.DrawBatch(vertices, nv, PrimitiveType.LineList);
};
}

public float LineWidth
Expand All @@ -54,11 +60,7 @@ public void Flush()
if (nv > 0)
{
renderer.Device.SetBlendMode(BlendMode.Alpha);
shader.Render(() =>
{
renderer.SetLineWidth(LineWidth);
renderer.DrawBatch(vertices, nv, PrimitiveType.LineList);
});
shader.Render(renderAction);
renderer.Device.SetBlendMode(BlendMode.None);

nv = 0;
Expand Down
5 changes: 4 additions & 1 deletion OpenRA.Game/Graphics/QuadRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
#endregion

using System;
using System.Drawing;

namespace OpenRA.Graphics
Expand All @@ -16,6 +17,7 @@ public class QuadRenderer : Renderer.IBatchRenderer
{
readonly Renderer renderer;
readonly IShader shader;
readonly Action renderAction;

readonly Vertex[] vertices;
int nv = 0;
Expand All @@ -25,14 +27,15 @@ public QuadRenderer(Renderer renderer, IShader shader)
this.renderer = renderer;
this.shader = shader;
vertices = new Vertex[renderer.TempBufferSize];
renderAction = () => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList);
}

public void Flush()
{
if (nv > 0)
{
renderer.Device.SetBlendMode(BlendMode.Alpha);
shader.Render(() => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList));
shader.Render(renderAction);
renderer.Device.SetBlendMode(BlendMode.None);

nv = 0;
Expand Down
4 changes: 3 additions & 1 deletion OpenRA.Game/Graphics/SpriteRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class SpriteRenderer : Renderer.IBatchRenderer
{
readonly Renderer renderer;
readonly IShader shader;
readonly Action renderAction;

readonly Vertex[] vertices;
Sheet currentSheet;
Expand All @@ -28,6 +29,7 @@ public SpriteRenderer(Renderer renderer, IShader shader)
this.renderer = renderer;
this.shader = shader;
vertices = new Vertex[renderer.TempBufferSize];
renderAction = () => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList);
}

public void Flush()
Expand All @@ -37,7 +39,7 @@ public void Flush()
shader.SetTexture("DiffuseTexture", currentSheet.GetTexture());

renderer.Device.SetBlendMode(currentBlend);
shader.Render(() => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList));
shader.Render(renderAction);
renderer.Device.SetBlendMode(BlendMode.None);

nv = 0;
Expand Down
29 changes: 22 additions & 7 deletions OpenRA.Game/Graphics/WorldRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ public sealed class WorldRenderer : IDisposable
public static readonly Func<IRenderable, int> RenderableScreenZPositionComparisonKey =
r => ZPosition(r.Pos, r.ZOffset);

const int RangeCircleSegments = 32;
static readonly int[][] RangeCircleStartRotations = Exts.MakeArray(RangeCircleSegments, i => WRot.FromFacing(8 * i).AsMatrix());
static readonly int[][] RangeCircleEndRotations = Exts.MakeArray(RangeCircleSegments, i => WRot.FromFacing(8 * i + 6).AsMatrix());

public readonly World World;
public readonly Theater Theater;
public Viewport Viewport { get; private set; }
Expand Down Expand Up @@ -197,10 +201,10 @@ public void DrawRollover(Actor unit)
public void DrawRangeCircle(WPos pos, WDist range, Color c)
{
var offset = new WVec(range.Length, 0, 0);
for (var i = 0; i < 32; i++)
for (var i = 0; i < RangeCircleSegments; i++)
{
var pa = pos + offset.Rotate(WRot.FromFacing(8 * i));
var pb = pos + offset.Rotate(WRot.FromFacing(8 * i + 6));
var pa = pos + offset.Rotate(RangeCircleStartRotations[i]);
var pb = pos + offset.Rotate(RangeCircleEndRotations[i]);
Game.Renderer.WorldLineRenderer.DrawLine(ScreenPosition(pa), ScreenPosition(pb), c);
}
}
Expand Down Expand Up @@ -240,17 +244,28 @@ public int2 ScreenPxPosition(WPos pos)
}

// For scaling vectors to pixel sizes in the voxel renderer
public float[] ScreenVector(WVec vec)
public void ScreenVectorComponents(WVec vec, out float x, out float y, out float z)
{
var ts = Game.ModData.Manifest.TileSize;
return new float[] { ts.Width * vec.X / 1024f, ts.Height * vec.Y / 1024f, ts.Height * vec.Z / 1024f, 1 };
x = ts.Width * vec.X / 1024f;
y = ts.Height * vec.Y / 1024f;
z = ts.Height * vec.Z / 1024f;
}

// For scaling vectors to pixel sizes in the voxel renderer
public float[] ScreenVector(WVec vec)
{
float x, y, z;
ScreenVectorComponents(vec, out x, out y, out z);
return new[] { x, y, z, 1f };
}

public int2 ScreenPxOffset(WVec vec)
{
// Round to nearest pixel
var px = ScreenVector(vec);
return new int2((int)Math.Round(px[0]), (int)Math.Round(px[1] - px[2]));
float x, y, z;
ScreenVectorComponents(vec, out x, out y, out z);
return new int2((int)Math.Round(x), (int)Math.Round(y - z));
}

public float ScreenZPosition(WPos pos, int offset)
Expand Down
8 changes: 8 additions & 0 deletions OpenRA.Game/Traits/TraitsInterfaces.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ public enum Stance
Ally = 4,
}

public static class StanceExts
{
public static bool HasStance(this Stance s, Stance stance)
{
return (s & stance) == stance;
}
}

[Flags]
public enum ImpactType
{
Expand Down
7 changes: 6 additions & 1 deletion OpenRA.Game/WVec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,12 @@ public struct WVec : IScriptBindable, ILuaAdditionBinding, ILuaSubtractionBindin

public WVec Rotate(WRot rot)
{
var mtx = rot.AsMatrix();
return Rotate(rot.AsMatrix());
}

public WVec Rotate(int[] rotationMatrix)
{
var mtx = rotationMatrix;
var lx = (long)X;
var ly = (long)Y;
var lz = (long)Z;
Expand Down
10 changes: 6 additions & 4 deletions OpenRA.Mods.Common/Graphics/VoxelRenderable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,9 @@ public void RenderDebugGeometry(WorldRenderer wr)
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform,
(x, y) => Util.MatrixMultiply(x, Util.MakeFloatMatrix(y.AsMatrix())));

var pxOffset = wr.ScreenVector(v.OffsetFunc());
var pxPos = pxOrigin + new float2(pxOffset[0], pxOffset[1]);
float sx, sy, sz;
wr.ScreenVectorComponents(v.OffsetFunc(), out sx, out sy, out sz);
var pxPos = pxOrigin + new float2(sx, sy);
var screenTransform = Util.MatrixMultiply(cameraTransform, worldTransform);
DrawBoundsBox(pxPos, screenTransform, bounds, Color.Yellow);
}
Expand Down Expand Up @@ -204,8 +205,9 @@ public Rectangle ScreenBounds(WorldRenderer wr)
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform,
(x, y) => Util.MatrixMultiply(x, Util.MakeFloatMatrix(y.AsMatrix())));

var pxOffset = wr.ScreenVector(v.OffsetFunc());
var pxPos = pxOrigin + new float2(pxOffset[0], pxOffset[1]);
float sx, sy, sz;
wr.ScreenVectorComponents(v.OffsetFunc(), out sx, out sy, out sz);
var pxPos = pxOrigin + new float2(sx, sy);
var screenTransform = Util.MatrixMultiply(cameraTransform, worldTransform);

for (var i = 0; i < 8; i++)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public bool IsVisible(Actor self, Player byPlayer)
return true;

var stance = self.Owner.Stances[byPlayer];
return info.AlwaysVisibleStances.HasFlag(stance) || visible[byPlayer];
return info.AlwaysVisibleStances.HasStance(stance) || visible[byPlayer];
}

public void Tick(Actor self)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Modifiers/HiddenUnderShroud.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public bool IsVisible(Actor self, Player byPlayer)
return true;

var stance = self.Owner.Stances[byPlayer];
return Info.AlwaysVisibleStances.HasFlag(stance) || IsVisibleInner(self, byPlayer);
return Info.AlwaysVisibleStances.HasStance(stance) || IsVisibleInner(self, byPlayer);
}

public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
Expand Down
26 changes: 13 additions & 13 deletions OpenRA.Mods.Common/Traits/Passenger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,23 +111,23 @@ public class PassengerInfo : ITraitInfo
public class Passenger : IIssueOrder, IResolveOrder, IOrderVoice, INotifyRemovedFromWorld
{
public readonly PassengerInfo Info;
public Passenger(PassengerInfo info) { Info = info; }
public Actor Transport;
public Cargo ReservedCargo { get; private set; }

public IEnumerable<IOrderTargeter> Orders
public Passenger(PassengerInfo info)
{
get
Info = info;
Func<Actor, bool> canTarget = IsCorrectCargoType;
Func<Actor, bool> useEnterCursor = CanEnter;
Orders = new EnterAlliedActorTargeter<Cargo>[]
{
yield return new EnterTransportTargeter("EnterTransport", 5,
target => IsCorrectCargoType(target), target => CanEnter(target),
Info.AlternateTransportsMode);
yield return new EnterTransportsTargeter("EnterTransports", 5,
target => IsCorrectCargoType(target), target => CanEnter(target),
Info.AlternateTransportsMode);
}
new EnterTransportTargeter("EnterTransport", 5, canTarget, useEnterCursor, Info.AlternateTransportsMode),
new EnterTransportsTargeter("EnterTransports", 5, canTarget, useEnterCursor, Info.AlternateTransportsMode)
};
}

public Actor Transport;
public Cargo ReservedCargo { get; private set; }

public IEnumerable<IOrderTargeter> Orders { get; private set; }

public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{
if (order.OrderID == "EnterTransport" || order.OrderID == "EnterTransports")
Expand Down
17 changes: 9 additions & 8 deletions OpenRA.Mods.Common/Traits/Render/WithDecoration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;

Expand Down Expand Up @@ -87,27 +88,27 @@ public void PlaySingleFrame(int frame)
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{
if (IsTraitDisabled)
yield break;
return Enumerable.Empty<IRenderable>();

if (self.IsDead || !self.IsInWorld)
yield break;
return Enumerable.Empty<IRenderable>();

if (anim == null)
yield break;
return Enumerable.Empty<IRenderable>();

var allied = self.Owner.IsAlliedWith(self.World.RenderPlayer);

if (!allied && !info.ShowToEnemies)
yield break;
return Enumerable.Empty<IRenderable>();

if (allied && !info.ShowToAllies)
yield break;
return Enumerable.Empty<IRenderable>();

if (!ShouldRender(self))
yield break;
return Enumerable.Empty<IRenderable>();

if (self.World.FogObscures(self))
yield break;
return Enumerable.Empty<IRenderable>();

var pxPos = wr.ScreenPxPosition(self.CenterPosition);
var actorBounds = self.Bounds;
Expand Down Expand Up @@ -150,7 +151,7 @@ public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)

anim.Tick();

yield return new SpriteRenderable(img, renderPos, WVec.Zero, info.ZOffset, wr.Palette(info.Palette), info.Scale, true);
return new IRenderable[] { new SpriteRenderable(img, renderPos, WVec.Zero, info.ZOffset, wr.Palette(info.Palette), info.Scale, true) };
}
}
}
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Tooltip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class TooltipInfo : ITraitInfo, ITooltipInfo

public string TooltipForPlayerStance(Stance stance)
{
if (stance == Stance.None || !GenericVisibility.HasFlag(stance))
if (stance == Stance.None || !GenericVisibility.HasStance(stance))
return Name;

if (GenericStancePrefix && stance == Stance.Ally)
Expand Down
6 changes: 3 additions & 3 deletions OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ void ActorEntered(Actor a)
return;

var stance = self.Owner.Stances[a.Owner];
if (!info.ValidStances.HasFlag(stance))
if (!info.ValidStances.HasStance(stance))
return;

var um = a.TraitOrDefault<UpgradeManager>();
Expand All @@ -110,7 +110,7 @@ public void UnitProducedByOther(Actor self, Actor producer, Actor produced)
if ((produced.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= info.Range.LengthSquared)
{
var stance = self.Owner.Stances[produced.Owner];
if (!info.ValidStances.HasFlag(stance))
if (!info.ValidStances.HasStance(stance))
return;

var um = produced.TraitOrDefault<UpgradeManager>();
Expand All @@ -127,7 +127,7 @@ void ActorExited(Actor a)
return;

var stance = self.Owner.Stances[a.Owner];
if (!info.ValidStances.HasFlag(stance))
if (!info.ValidStances.HasStance(stance))
return;

var um = a.TraitOrDefault<UpgradeManager>();
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.Common/Warheads/Warhead.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public bool IsValidAgainst(Actor victim, Actor firedBy)
return false;

var stance = firedBy.Owner.Stances[victim.Owner];
if (!ValidStances.HasFlag(stance))
if (!ValidStances.HasStance(stance))
return false;

// A target type is valid if it is in the valid targets list, and not in the invalid targets list.
Expand All @@ -80,7 +80,7 @@ public bool IsValidAgainst(FrozenActor victim, Actor firedBy)

// AffectsParent checks do not make sense for FrozenActors, so skip to stance checks
var stance = firedBy.Owner.Stances[victim.Owner];
if (!ValidStances.HasFlag(stance))
if (!ValidStances.HasStance(stance))
return false;

// A target type is valid if it is in the valid targets list, and not in the invalid targets list.
Expand Down

0 comments on commit bea021a

Please sign in to comment.