Cache IOrderValidator traits on World

This commit is contained in:
reaperrr
2020-09-15 10:38:29 +02:00
committed by Paul Chote
parent ca8341d432
commit 904a5f60d1
2 changed files with 5 additions and 6 deletions

View File

@@ -336,14 +336,10 @@ namespace OpenRA.Network
break; break;
if (order.GroupedActors == null) if (order.GroupedActors == null)
ResolveOrder(order, world.WorldActor.TraitsImplementing<IValidateOrder>(), orderManager, clientId); ResolveOrder(order, world.OrderValidators, orderManager, clientId);
else else
{
// PERF: Cache the result of TraitsImplementing as we are likely to use it for several order subjects
var validateOrders = world.WorldActor.TraitsImplementing<IValidateOrder>().ToArray();
foreach (var subject in order.GroupedActors) foreach (var subject in order.GroupedActors)
ResolveOrder(Order.FromGroupedOrder(order, subject), validateOrders, orderManager, clientId); ResolveOrder(Order.FromGroupedOrder(order, subject), world.OrderValidators, orderManager, clientId);
}
break; break;
} }

View File

@@ -142,6 +142,8 @@ namespace OpenRA
public readonly ScreenMap ScreenMap; public readonly ScreenMap ScreenMap;
public readonly WorldType Type; public readonly WorldType Type;
public readonly IValidateOrder[] OrderValidators;
readonly GameInformation gameInfo; readonly GameInformation gameInfo;
// Hide the OrderManager from mod code // Hide the OrderManager from mod code
@@ -203,6 +205,7 @@ namespace OpenRA
ActorMap = WorldActor.Trait<IActorMap>(); ActorMap = WorldActor.Trait<IActorMap>();
ScreenMap = WorldActor.Trait<ScreenMap>(); ScreenMap = WorldActor.Trait<ScreenMap>();
Selection = WorldActor.Trait<ISelection>(); Selection = WorldActor.Trait<ISelection>();
OrderValidators = WorldActor.TraitsImplementing<IValidateOrder>().ToArray();
// Reset mask // Reset mask
LongBitSet<PlayerBitMask>.Reset(); LongBitSet<PlayerBitMask>.Reset();