Only render the frozen actors that are visible. Fixes #4300.

This commit is contained in:
Paul Chote
2013-12-13 17:49:58 +13:00
parent 1bbe200e32
commit 45ccf0035e
2 changed files with 23 additions and 1 deletions

View File

@@ -136,7 +136,7 @@ namespace OpenRA.Traits
public virtual IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) public virtual IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{ {
return frozen.Values return world.ScreenMap.FrozenActorsInBox(owner, wr.Viewport.TopLeft, wr.Viewport.BottomRight)
.Where(f => f.Visible) .Where(f => f.Visible)
.SelectMany(ff => ff.Render(wr)); .SelectMany(ff => ff.Render(wr));
} }

View File

@@ -161,5 +161,27 @@ namespace OpenRA.Traits
return actorsInBox.Distinct(); return actorsInBox.Distinct();
} }
public IEnumerable<FrozenActor> FrozenActorsInBox(Player p, int2 a, int2 b)
{
return FrozenActorsInBox(p, Rectangle.FromLTRB(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)));
}
public IEnumerable<FrozenActor> FrozenActorsInBox(Player p, Rectangle r)
{
var left = (r.Left / info.BinSize).Clamp(0, cols - 1);
var right = (r.Right / info.BinSize).Clamp(0, cols - 1);
var top = (r.Top / info.BinSize).Clamp(0, rows - 1);
var bottom = (r.Bottom / info.BinSize).Clamp(0, rows - 1);
var frozenInBox = new List<FrozenActor>();
for (var j = top; j <= bottom; j++)
for (var i = left; i <= right; i++)
frozenInBox.AddRange(frozen[p][j * cols + i]
.Where(kv => kv.Key.IsValid && kv.Value.IntersectsWith(r))
.Select(kv => kv.Key));
return frozenInBox.Distinct();
}
} }
} }