Cache FrozenActorLayer on the Player object.

This avoids unnecessary trait queries.
This commit is contained in:
Paul Chote
2018-11-28 08:52:55 +00:00
committed by Oliver Brakmann
parent f238e2c5cc
commit 3e490e5843
6 changed files with 11 additions and 12 deletions

View File

@@ -112,11 +112,10 @@ namespace OpenRA
if (world == null || !TryGetActorFromUInt(world, playerActorID, out playerActor))
break;
var frozenLayer = playerActor.TraitOrDefault<FrozenActorLayer>();
if (frozenLayer == null)
if (playerActor.Owner.FrozenActorLayer == null)
break;
var frozen = frozenLayer.FromID(frozenActorID);
var frozen = playerActor.Owner.FrozenActorLayer.FromID(frozenActorID);
if (frozen != null)
target = Target.FromFrozenActor(frozen);

View File

@@ -56,6 +56,8 @@ namespace OpenRA
public readonly PlayerReference PlayerReference;
public readonly bool IsBot;
public readonly string BotType;
public readonly Shroud Shroud;
public readonly FrozenActorLayer FrozenActorLayer;
/// <summary>The faction (including Random, etc) that was selected in the lobby.</summary>
public readonly FactionInfo DisplayFaction;
@@ -65,7 +67,6 @@ namespace OpenRA
public bool HasObjectives = false;
public bool Spectating;
public Shroud Shroud;
public World World { get; private set; }
readonly bool inMissionMap;
@@ -156,6 +157,7 @@ namespace OpenRA
var playerActorType = world.Type == WorldType.Editor ? "EditorPlayer" : "Player";
PlayerActor = world.CreateActor(playerActorType, new TypeDictionary { new OwnerInit(this) });
Shroud = PlayerActor.Trait<Shroud>();
FrozenActorLayer = PlayerActor.TraitOrDefault<FrozenActorLayer>();
// Enable the bot logic on the host
IsBot = BotType != null;

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Cnc.Effects
visibilityModifiers = actor.TraitsImplementing<IVisibilityModifier>().ToArray();
dotStates = new PlayerDictionary<DotState>(actor.World,
p => new DotState(actor, p.PlayerActor.Trait<GpsWatcher>(), p.PlayerActor.TraitOrDefault<FrozenActorLayer>()));
p => new DotState(actor, p.PlayerActor.Trait<GpsWatcher>(), p.FrozenActorLayer));
}
bool ShouldRender(DotState state, Player toPlayer)

View File

@@ -49,7 +49,7 @@ namespace OpenRA.Mods.Cnc.Traits
public readonly GpsWatcher GpsWatcher;
public Traits(Player player, FrozenUnderFogUpdatedByGps frozenUnderFogUpdatedByGps)
{
FrozenActorLayer = player.PlayerActor.TraitOrDefault<FrozenActorLayer>();
FrozenActorLayer = player.FrozenActorLayer;
GpsWatcher = player.PlayerActor.TraitOrDefault<GpsWatcher>();
GpsWatcher.RegisterForOnGpsRefreshed(frozenUnderFogUpdatedByGps.self, frozenUnderFogUpdatedByGps);
}

View File

@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
}
/// <summary>Evaluates the attractiveness of a position according to all considerations</summary>
public int GetAttractiveness(WPos pos, Player firedBy, FrozenActorLayer frozenLayer)
public int GetAttractiveness(WPos pos, Player firedBy)
{
var answer = 0;
var world = firedBy.World;
@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits
var delta = new WVec(radiusToUse, radiusToUse, WDist.Zero);
var tl = world.Map.CellContaining(pos - delta);
var br = world.Map.CellContaining(pos + delta);
var checkFrozen = frozenLayer.FrozenActorsInRegion(new CellRegion(world.Map.Grid.Type, tl, br));
var checkFrozen = firedBy.FrozenActorLayer.FrozenActorsInRegion(new CellRegion(world.Map.Grid.Type, tl, br));
// IsValid check filters out Frozen Actors that have not initizialized their Owner
foreach (var scrutinized in checkFrozen)

View File

@@ -41,7 +41,6 @@ namespace OpenRA.Mods.Common.Traits
{
readonly World world;
readonly Player player;
FrozenActorLayer frozenLayer;
SupportPowerManager supportPowerManager;
Dictionary<SupportPowerInstance, int> waitingPowers = new Dictionary<SupportPowerInstance, int>();
Dictionary<string, SupportPowerDecision> powerDecisions = new Dictionary<string, SupportPowerDecision>();
@@ -55,7 +54,6 @@ namespace OpenRA.Mods.Common.Traits
protected override void TraitEnabled(Actor self)
{
frozenLayer = player.PlayerActor.TraitOrDefault<FrozenActorLayer>();
supportPowerManager = player.PlayerActor.Trait<SupportPowerManager>();
foreach (var decision in Info.Decisions)
powerDecisions.Add(decision.OrderName, decision);
@@ -140,7 +138,7 @@ namespace OpenRA.Mods.Common.Traits
var wbr = world.Map.CenterOfCell(br.ToCPos(map));
var targets = world.ActorMap.ActorsInBox(wtl, wbr);
var frozenTargets = frozenLayer != null ? frozenLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>();
var frozenTargets = player.FrozenActorLayer != null ? player.FrozenActorLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>();
var consideredAttractiveness = powerDecision.GetAttractiveness(targets, player) + powerDecision.GetAttractiveness(frozenTargets, player);
if (consideredAttractiveness <= bestAttractiveness || consideredAttractiveness < powerDecision.MinimumAttractiveness)
continue;
@@ -176,7 +174,7 @@ namespace OpenRA.Mods.Common.Traits
var y = checkPos.Y + j;
var pos = world.Map.CenterOfCell(new CPos(x, y));
var consideredAttractiveness = 0;
consideredAttractiveness += powerDecision.GetAttractiveness(pos, player, frozenLayer);
consideredAttractiveness += powerDecision.GetAttractiveness(pos, player);
if (consideredAttractiveness <= bestAttractiveness || consideredAttractiveness < powerDecision.MinimumAttractiveness)
continue;