Sort renderables in-place in WorldRenderer.GenerateRenderables

This commit is contained in:
RoosterDragon
2020-10-11 11:54:35 +01:00
committed by abcdefg30
parent 2adee1e374
commit 71e3ca4493
5 changed files with 8 additions and 6 deletions

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Graphics
{ {
public sealed class WorldRenderer : IDisposable public sealed class WorldRenderer : IDisposable
{ {
public static readonly Func<IRenderable, int> RenderableScreenZPositionComparisonKey = public static readonly Func<IRenderable, int> RenderableZPositionComparisonKey =
r => ZPosition(r.Pos, r.ZOffset); r => ZPosition(r.Pos, r.ZOffset);
public readonly Size TileSize; public readonly Size TileSize;
@@ -133,7 +133,9 @@ namespace OpenRA.Graphics
foreach (var e in World.ScreenMap.RenderableEffectsInBox(Viewport.TopLeft, Viewport.BottomRight)) foreach (var e in World.ScreenMap.RenderableEffectsInBox(Viewport.TopLeft, Viewport.BottomRight))
renderablesBuffer.AddRange(e.Render(this)); renderablesBuffer.AddRange(e.Render(this));
foreach (var renderable in renderablesBuffer.OrderBy(RenderableScreenZPositionComparisonKey)) renderablesBuffer.Sort((x, y) => RenderableZPositionComparisonKey(x).CompareTo(RenderableZPositionComparisonKey(y)));
foreach (var renderable in renderablesBuffer)
preparedRenderables.Add(renderable.PrepareRender(this)); preparedRenderables.Add(renderable.PrepareRender(this));
// PERF: Reuse collection to avoid allocations. // PERF: Reuse collection to avoid allocations.

View File

@@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var r in RenderFootprint(wr, topLeft, footprint, info.FootprintUnderPreview)) foreach (var r in RenderFootprint(wr, topLeft, footprint, info.FootprintUnderPreview))
yield return r; yield return r;
foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey)) foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableZPositionComparisonKey))
yield return r; yield return r;
if (info.FootprintOverPreview != PlaceBuildingCellType.None) if (info.FootprintOverPreview != PlaceBuildingCellType.None)

View File

@@ -249,7 +249,7 @@ namespace OpenRA.Mods.Common.Traits
var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))); var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation)));
var previewRenderables = carryablePreview var previewRenderables = carryablePreview
.SelectMany(p => p.Render(wr, self.CenterPosition + offset)) .SelectMany(p => p.Render(wr, self.CenterPosition + offset))
.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey); .OrderBy(WorldRenderer.RenderableZPositionComparisonKey);
foreach (var r in previewRenderables) foreach (var r in previewRenderables)
yield return r; yield return r;

View File

@@ -147,7 +147,7 @@ namespace OpenRA.Mods.Common.Traits
return terrainOrResourcePreview; return terrainOrResourcePreview;
if (Type == EditorCursorType.Actor) if (Type == EditorCursorType.Actor)
return Actor.Render().OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey); return Actor.Render().OrderBy(WorldRenderer.RenderableZPositionComparisonKey);
return NoRenderables; return NoRenderables;
} }

View File

@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Widgets
renderables = preview renderables = preview
.SelectMany(p => p.RenderUI(worldRenderer, origin, scale)) .SelectMany(p => p.RenderUI(worldRenderer, origin, scale))
.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey) .OrderBy(WorldRenderer.RenderableZPositionComparisonKey)
.Select(r => r.PrepareRender(worldRenderer)) .Select(r => r.PrepareRender(worldRenderer))
.ToArray(); .ToArray();
} }