From f6471d411ec2d12195044ea7fed2879c84b46da1 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Thu, 22 Mar 2018 20:45:41 +0000 Subject: [PATCH] Reuse set when rendering actors in the world to avoid allocations. --- OpenRA.Game/Graphics/WorldRenderer.cs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index f2a132a9e7..508738266f 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -31,6 +31,7 @@ namespace OpenRA.Graphics public event Action PaletteInvalidated = null; + readonly HashSet onScreenActors = new HashSet(); readonly HardwarePalette palette = new HardwarePalette(); readonly Dictionary palettes = new Dictionary(); readonly TerrainRenderer terrainRenderer; @@ -100,9 +101,9 @@ namespace OpenRA.Graphics palettes[name].Palette = pal; } - List GenerateRenderables(HashSet actorsInBox) + List GenerateRenderables() { - var actors = actorsInBox.Append(World.WorldActor); + var actors = onScreenActors.Append(World.WorldActor); if (World.RenderPlayer != null) actors = actors.Append(World.RenderPlayer.PlayerActor); @@ -126,15 +127,15 @@ namespace OpenRA.Graphics return renderables; } - List GenerateOverlayRenderables(HashSet actorsInBox) + List GenerateOverlayRenderables() { var aboveShroud = World.ActorsWithTrait() - .Where(a => a.Actor.IsInWorld && !a.Actor.Disposed && (!a.Trait.SpatiallyPartitionable || actorsInBox.Contains(a.Actor))) + .Where(a => a.Actor.IsInWorld && !a.Actor.Disposed && (!a.Trait.SpatiallyPartitionable || onScreenActors.Contains(a.Actor))) .SelectMany(a => a.Trait.RenderAboveShroud(a.Actor, this)); var aboveShroudSelected = World.Selection.Actors.Where(a => a.IsInWorld && !a.Disposed) .SelectMany(a => a.TraitsImplementing() - .Where(t => !t.SpatiallyPartitionable || actorsInBox.Contains(a)) + .Where(t => !t.SpatiallyPartitionable || onScreenActors.Contains(a)) .SelectMany(t => t.RenderAboveShroud(a, this))); var aboveShroudEffects = World.Effects.Select(e => e as IEffectAboveShroud) @@ -171,8 +172,8 @@ namespace OpenRA.Graphics RefreshPalette(); - var onScreenActors = World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight).ToHashSet(); - var renderables = GenerateRenderables(onScreenActors); + onScreenActors.UnionWith(World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight)); + var renderables = GenerateRenderables(); var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor); Game.Renderer.EnableScissor(bounds); @@ -205,7 +206,7 @@ namespace OpenRA.Graphics Game.Renderer.DisableScissor(); - var finalOverlayRenderables = GenerateOverlayRenderables(onScreenActors); + var finalOverlayRenderables = GenerateOverlayRenderables(); // HACK: Keep old grouping behaviour var groupedOverlayRenderables = finalOverlayRenderables.GroupBy(prs => prs.GetType()); @@ -239,6 +240,9 @@ namespace OpenRA.Graphics } Game.Renderer.Flush(); + + // PERF: Reuse collection to avoid allocations. + onScreenActors.Clear(); } public void RefreshPalette()