Significantly improve actor placement and removal speeds

This commit is contained in:
Gustas
2025-09-11 12:58:09 +03:00
committed by Paul Chote
parent 7d4a590240
commit b5b44c048d
5 changed files with 228 additions and 50 deletions

View File

@@ -11,11 +11,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using OpenRA.Graphics;
using OpenRA.Mods.Common.EditorBrushes;
using OpenRA.Mods.Common.Graphics;
using OpenRA.Mods.Common.Traits;
using OpenRA.Support;
using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets
@@ -384,8 +385,8 @@ namespace OpenRA.Mods.Common.Widgets
if (blitFilters.HasFlag(MapBlitFilters.Actors))
{
// Clear any existing actors in the paste cells.
foreach (var regionActor in editorActorLayer.PreviewsInCellRegion(area.CellCoords).ToList())
editorActorLayer.Remove(regionActor);
using (new PerfTimer("RemoveActors", 1))
editorActorLayer.RemoveRegion(area.CellCoords);
}
foreach (var tileKeyValuePair in editorBlitSource.Tiles)
@@ -432,6 +433,7 @@ namespace OpenRA.Mods.Common.Widgets
if (blitFilters.HasFlag(MapBlitFilters.Actors))
{
// Create copies of the original actors, update their locations, and place.
var copies = new List<ActorReference>(editorBlitSource.Actors.Count);
foreach (var actorKeyValuePair in editorBlitSource.Actors)
{
var copy = actorKeyValuePair.Value.Export();
@@ -445,8 +447,10 @@ namespace OpenRA.Mods.Common.Widgets
copy.Add(new LocationInit(locationInit.Value));
}
editorActorLayer.Add(copy);
copies.Add(copy);
}
editorActorLayer.AddRange(CollectionsMarshal.AsSpan(copies));
}
}
}