From 803390c68e069596a94583e5a1d73b2e66c95fa4 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Wed, 25 Feb 2015 20:17:02 +0000 Subject: [PATCH] Speed up rendering map border shroud when no shroud is visible. When the map border shroud must be rendered, but no cells at the border are visible, then we know that no shroud will be visible at all. We can bail from rendering early in this case. --- .../Traits/World/ShroudRenderer.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 787e1f73d3..37521d613c 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits public void RenderShroud(WorldRenderer wr, Shroud shroud) { Update(shroud); - Render(wr.Viewport.VisibleCells); + Render(CellRegion.Expand(wr.Viewport.VisibleCells, 1)); } void Update(Shroud newShroud) @@ -269,22 +269,22 @@ namespace OpenRA.Mods.Common.Traits void Render(CellRegion visibleRegion) { - var renderRegion = CellRegion.Expand(visibleRegion, 1).MapCoords; - if (currentShroud == null) - { - RenderMapBorderShroud(renderRegion); - return; - } - - RenderPlayerShroud(visibleRegion, renderRegion); + RenderMapBorderShroud(visibleRegion); + else + RenderPlayerShroud(visibleRegion); } - void RenderMapBorderShroud(CellRegion.MapCoordsRegion renderRegion) + void RenderMapBorderShroud(CellRegion visibleRegion) { + // The map border shroud only affects the map border. If none of the visible cells are on the border, then + // we don't need to render anything and can bail early for performance. + if (map.Cells.Contains(visibleRegion)) + return; + // Render the shroud that just encroaches at the map border. This shroud is always fully cached, so we can // just render straight from the cache. - foreach (var uv in renderRegion) + foreach (var uv in visibleRegion.MapCoords) { var offset = VertexArrayOffset(uv); RenderCachedTile(shroudSpriteLayer[uv], shroudVertices, offset); @@ -292,7 +292,7 @@ namespace OpenRA.Mods.Common.Traits } } - void RenderPlayerShroud(CellRegion visibleRegion, CellRegion.MapCoordsRegion renderRegion) + void RenderPlayerShroud(CellRegion visibleRegion) { // Render the shroud by drawing the appropriate tile over each cell that is visible on-screen. // For performance we keep a cache tiles we have drawn previously so we don't have to recalculate the @@ -303,7 +303,7 @@ namespace OpenRA.Mods.Common.Traits // cached vertices. var visibleUnderShroud = currentShroud.IsExploredTest(visibleRegion); var visibleUnderFog = currentShroud.IsVisibleTest(visibleRegion); - foreach (var uv in renderRegion) + foreach (var uv in visibleRegion.MapCoords) { var offset = VertexArrayOffset(uv); if (shroudDirty[uv])