diff --git a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs index 8e730db8c6..939288eb9a 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs @@ -125,6 +125,7 @@ namespace OpenRA.Mods.Common.Traits readonly HashSet activeUnits = new(); public List Squads = new(); + readonly Stack squadsPendingUpdate = new(); readonly ActorIndex.NamesAndTrait constructionYardBuildings; IBot bot; @@ -347,7 +348,16 @@ namespace OpenRA.Mods.Common.Traits { attackForceTicks = Info.AttackForceInterval; foreach (var s in Squads) - s.Update(); + squadsPendingUpdate.Push(s); + } + + // PERF: Spread out squad updates across multiple ticks. + var updateCount = Exts.IntegerDivisionRoundingAwayFromZero(squadsPendingUpdate.Count, attackForceTicks); + for (var i = 0; i < updateCount; i++) + { + var squadPendingUpdate = squadsPendingUpdate.Pop(); + if (squadPendingUpdate.IsValid) + squadPendingUpdate.Update(); } if (--assignRolesTicks <= 0)