From 9e705a3bcdb84b6fcfa9c5f0cef91e4f110ebbd6 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 18 Apr 2010 18:22:44 +1200 Subject: [PATCH] ridiculous perf win in SmudgeLayer --- OpenRA.FileFormats/Map/Map.cs | 17 ++++++++++------- OpenRA.Game/Graphics/TerrainRenderer.cs | 4 ++-- OpenRA.Game/Graphics/Viewport.cs | 8 ++++++++ OpenRA.Game/Graphics/WorldRenderer.cs | 6 +++--- OpenRA.Game/ShroudRenderer.cs | 11 ++++++----- OpenRA.Game/Traits/World/SmudgeLayer.cs | 18 ++++++++++++------ 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/OpenRA.FileFormats/Map/Map.cs b/OpenRA.FileFormats/Map/Map.cs index 7628b57e17..66ac029974 100644 --- a/OpenRA.FileFormats/Map/Map.cs +++ b/OpenRA.FileFormats/Map/Map.cs @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with OpenRA. If not, see . */ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; +#endregion + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; using System.Security.Cryptography; namespace OpenRA.FileFormats @@ -57,6 +58,8 @@ namespace OpenRA.FileFormats public int2 TopLeft; public int2 BottomRight; + public Rectangle Bounds { get { return Rectangle.FromLTRB(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y); } } + public TileReference[,] MapTiles; public TileReference[,] MapResources; diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index bbb9c2de0d..ed3a1df604 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -90,9 +90,9 @@ namespace OpenRA.Graphics if (firstRow < 0) firstRow = 0; if (lastRow > map.Height) lastRow = map.Height; - if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.bounds.HasValue) + if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.Bounds.HasValue) { - var r = world.LocalPlayer.Shroud.bounds.Value; + var r = world.LocalPlayer.Shroud.Bounds.Value; if (firstRow < r.Top - map.YOffset) firstRow = r.Top - map.YOffset; diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 06c94149af..c154084e2a 100644 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -24,6 +24,7 @@ using OpenRA.Network; using OpenRA.Traits; using OpenRA.Widgets; using OpenRA.Support; +using System.Drawing; namespace OpenRA.Graphics { @@ -196,5 +197,12 @@ namespace OpenRA.Graphics { Center( player.World.Queries.OwnedBy[ player ].WithTrait().Select( a => a.Actor ) ); } + + public Rectangle? ShroudBounds() + { + var localPlayer = Game.world.LocalPlayer; + if (localPlayer == null) return null; + return localPlayer.Shroud.Bounds; + } } } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 944c36acc8..56b761712f 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -83,9 +83,9 @@ namespace OpenRA.Graphics Rectangle GetBoundsRect() { - if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.bounds.HasValue) + if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.Bounds.HasValue) { - var r = world.LocalPlayer.Shroud.bounds.Value; + var r = world.LocalPlayer.Shroud.Bounds.Value; var left = (int)(Game.CellSize * r.Left - Game.viewport.Location.X); var top = (int)(Game.CellSize * r.Top - Game.viewport.Location.Y); @@ -169,7 +169,7 @@ namespace OpenRA.Graphics { DrawBox(bounds, Color.Red); if (world.LocalPlayer != null) - DrawBox(world.LocalPlayer.Shroud.bounds.Value, Color.Blue); + DrawBox(world.LocalPlayer.Shroud.Bounds.Value, Color.Blue); for (var j = 0; j < world.Map.MapSize.Y; j += world.WorldActor.Info.Traits.Get().BinSize) diff --git a/OpenRA.Game/ShroudRenderer.cs b/OpenRA.Game/ShroudRenderer.cs index 05a1772763..43369f7b5b 100644 --- a/OpenRA.Game/ShroudRenderer.cs +++ b/OpenRA.Game/ShroudRenderer.cs @@ -35,7 +35,7 @@ namespace OpenRA bool disabled = false; Map map; - public Rectangle? bounds { get { return shroud.exploredBounds; } } + public Rectangle? Bounds { get { return shroud.exploredBounds; } } public ShroudRenderer(Player owner, Map map) { @@ -149,11 +149,12 @@ namespace OpenRA fogSprites[i, j] = ChooseFog(i, j); } - var miny = bounds.HasValue ? Math.Max(map.YOffset, bounds.Value.Top) : map.YOffset; - var maxy = bounds.HasValue ? Math.Min(map.YOffset + map.Height, bounds.Value.Bottom) : map.YOffset + map.Height; + var clipRect = Bounds.HasValue ? Rectangle.Intersect(Bounds.Value, map.Bounds) : map.Bounds; - var minx = bounds.HasValue ? Math.Max(map.XOffset, bounds.Value.Left) : map.XOffset; - var maxx = bounds.HasValue ? Math.Min(map.XOffset + map.Width, bounds.Value.Right) : map.XOffset + map.Width; + var miny = clipRect.Top; + var maxy = clipRect.Bottom; + var minx = clipRect.Left; + var maxx = clipRect.Right; var shroudPalette = "fog"; diff --git a/OpenRA.Game/Traits/World/SmudgeLayer.cs b/OpenRA.Game/Traits/World/SmudgeLayer.cs index e2ac2a9372..d349a61497 100644 --- a/OpenRA.Game/Traits/World/SmudgeLayer.cs +++ b/OpenRA.Game/Traits/World/SmudgeLayer.cs @@ -82,12 +82,18 @@ namespace OpenRA.Traits } public void Render() - { - var tl = world.Map.TopLeft; - var br = world.Map.BottomRight; - - for (int x = tl.X; x < br.X; x++) - for (int y = tl.Y; y < br.Y; y++) + { + var cliprect = Game.viewport.ShroudBounds().HasValue + ? Rectangle.Intersect(Game.viewport.ShroudBounds().Value, world.Map.Bounds) : world.Map.Bounds; + + var minx = cliprect.Left; + var maxx = cliprect.Right; + + var miny = cliprect.Top; + var maxy = cliprect.Bottom; + + for (int x = minx; x < maxx; x++) + for (int y = miny; y < maxy; y++) { var t = new int2(x, y); if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.IsExplored(t) || tiles[x,y].type == 0) continue;