Merge pull request #4303 from pchote/batch-fix
Fix two serious perf regressions.
This commit is contained in:
@@ -15,6 +15,8 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
public struct ContrailRenderable : IRenderable
|
public struct ContrailRenderable : IRenderable
|
||||||
{
|
{
|
||||||
|
public int Length { get { return trail.Length; } }
|
||||||
|
|
||||||
readonly World world;
|
readonly World world;
|
||||||
|
|
||||||
// Store trail positions in a circular buffer
|
// Store trail positions in a circular buffer
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
{
|
{
|
||||||
WPos pos;
|
WPos pos;
|
||||||
ContrailRenderable trail;
|
ContrailRenderable trail;
|
||||||
|
int ticks;
|
||||||
|
|
||||||
public ContrailFader(WPos pos, ContrailRenderable trail)
|
public ContrailFader(WPos pos, ContrailRenderable trail)
|
||||||
{
|
{
|
||||||
@@ -27,6 +28,9 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
|
|
||||||
public void Tick(World world)
|
public void Tick(World world)
|
||||||
{
|
{
|
||||||
|
if (ticks++ == trail.Length)
|
||||||
|
world.AddFrameEndTask(w => w.Remove(this));
|
||||||
|
|
||||||
trail.Update(pos);
|
trail.Update(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user