Save some perf.

This commit is contained in:
Paul Chote
2010-11-26 21:13:36 +13:00
parent 3b0810a096
commit e91caa4e7a
2 changed files with 17 additions and 6 deletions

View File

@@ -138,14 +138,22 @@ namespace OpenRA.Graphics
return new Rectangle(left, top, right - left, bottom - top); return new Rectangle(left, top, right - left, bottom - top);
} }
int2 cachedScroll = new int2(int.MaxValue, int.MaxValue);
Rectangle cachedRect;
public Rectangle WorldBounds(World world) public Rectangle WorldBounds(World world)
{
if (cachedScroll != scrollPosition)
{ {
int2 boundary = new int2(1,1); // Add a curtain of cells around the viewport to account for rounding errors int2 boundary = new int2(1,1); // Add a curtain of cells around the viewport to account for rounding errors
var tl = ViewToWorld(int2.Zero).ToInt2() - boundary; var tl = ViewToWorld(int2.Zero).ToInt2() - boundary;
var br = ViewToWorld(new int2(Width, Height)).ToInt2() + boundary; var br = ViewToWorld(new int2(Width, Height)).ToInt2() + boundary;
var view = Rectangle.Intersect(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y), world.Map.Bounds); cachedRect = Rectangle.Intersect(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y), world.Map.Bounds);
cachedScroll = scrollPosition;
}
var b = world.LocalShroud.Bounds; var b = world.LocalShroud.Bounds;
return (b.HasValue) ? Rectangle.Intersect(view, b.Value) : view; return (b.HasValue) ? Rectangle.Intersect(cachedRect, b.Value) : cachedRect;
} }
} }
} }

View File

@@ -128,9 +128,11 @@ namespace OpenRA
for (var j = clip.Top; j < clip.Bottom; j++) for (var j = clip.Top; j < clip.Bottom; j++)
{ {
var starti = clip.Left; var starti = clip.Left;
var last = shadowBits[0x0f];
for (var i = clip.Left; i < clip.Right; i++) for (var i = clip.Left; i < clip.Right; i++)
{ {
if (s[i, j] == shadowBits[0x0f]) if ((s[i, j] == shadowBits[0x0f] && last == shadowBits[0x0f])
|| (s[i, j] == shadowBits[0] && last == shadowBits[0]))
continue; continue;
if (starti != i) if (starti != i)
@@ -146,6 +148,7 @@ namespace OpenRA
Game.CellSize * new float2(i, j), Game.CellSize * new float2(i, j),
shroudPalette); shroudPalette);
starti = i + 1; starti = i + 1;
last = s[i, j];
} }
if (starti < clip.Right) if (starti < clip.Right)