From f67b7ad837fd5e23d894690ede218accc70260bd Mon Sep 17 00:00:00 2001 From: reaperrr Date: Tue, 15 Sep 2020 10:55:40 +0200 Subject: [PATCH] Cache IResolveOrder traits on Actor Avoids looking up all of them each time an actor is given an order. --- OpenRA.Game/Actor.cs | 8 ++++++++ OpenRA.Game/Network/UnitOrders.cs | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index c53b7a2d66..cb0ffdfbb6 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -102,6 +102,7 @@ namespace OpenRA readonly IFacing facing; readonly IHealth health; + readonly IResolveOrder[] resolveOrders; readonly IRenderModifier[] renderModifiers; readonly IRender[] renders; readonly IMouseBounds[] mouseBounds; @@ -156,6 +157,7 @@ namespace OpenRA EffectiveOwner = TraitOrDefault(); facing = TraitOrDefault(); health = TraitOrDefault(); + resolveOrders = TraitsImplementing().ToArray(); renderModifiers = TraitsImplementing().ToArray(); renders = TraitsImplementing().ToArray(); mouseBounds = TraitsImplementing().ToArray(); @@ -404,6 +406,12 @@ namespace OpenRA }); } + public void ResolveOrder(Order order) + { + foreach (var r in resolveOrders) + r.ResolveOrder(this, order); + } + // TODO: move elsewhere. public void ChangeOwner(Player newOwner) { diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 1500f45f4d..3a8ddca1b8 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -352,8 +352,7 @@ namespace OpenRA.Network return; if (world.OrderValidators.All(vo => vo.OrderValidation(orderManager, world, clientId, order))) - foreach (var t in order.Subject.TraitsImplementing()) - t.ResolveOrder(order.Subject, order); + order.Subject.ResolveOrder(order); } static void SetOrderLag(OrderManager o)