Change a dictionary to an array for faster player lookup in FrozenUnderFog.
Deferencing an array element to get the state is cheaper than a dictionary lookup. We can do this since the players collection does not change during gameplay.
This commit is contained in:
@@ -37,6 +37,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
readonly Dictionary<Player, FrozenState> stateByPlayer = new Dictionary<Player, FrozenState>();
|
readonly Dictionary<Player, FrozenState> stateByPlayer = new Dictionary<Player, FrozenState>();
|
||||||
|
|
||||||
|
FrozenState[] stateByPlayerIndex;
|
||||||
ITooltip tooltip;
|
ITooltip tooltip;
|
||||||
Health health;
|
Health health;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
@@ -87,34 +88,40 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
VisibilityHash = 0;
|
VisibilityHash = 0;
|
||||||
|
var players = self.World.Players;
|
||||||
|
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
{
|
{
|
||||||
|
// The world players never change, so we can safely index this collection.
|
||||||
|
stateByPlayerIndex = new FrozenState[players.Length];
|
||||||
tooltip = self.TraitsImplementing<ITooltip>().FirstOrDefault();
|
tooltip = self.TraitsImplementing<ITooltip>().FirstOrDefault();
|
||||||
health = self.TraitOrDefault<Health>();
|
health = self.TraitOrDefault<Health>();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var player in self.World.Players)
|
for (var i = 0; i < players.Length; i++)
|
||||||
{
|
{
|
||||||
FrozenActor frozenActor;
|
FrozenActor frozenActor;
|
||||||
bool isVisible;
|
bool isVisible;
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
{
|
{
|
||||||
|
var player = players[i];
|
||||||
frozenActor = new FrozenActor(self, footprint, player.Shroud, startsRevealed);
|
frozenActor = new FrozenActor(self, footprint, player.Shroud, startsRevealed);
|
||||||
isVisible = startsRevealed;
|
isVisible = startsRevealed;
|
||||||
stateByPlayer.Add(player, new FrozenState(frozenActor) { IsVisible = isVisible });
|
var state = new FrozenState(frozenActor) { IsVisible = isVisible };
|
||||||
|
stateByPlayer.Add(player, state);
|
||||||
|
stateByPlayerIndex[i] = state;
|
||||||
player.PlayerActor.Trait<FrozenActorLayer>().Add(frozenActor);
|
player.PlayerActor.Trait<FrozenActorLayer>().Add(frozenActor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var state = stateByPlayer[player];
|
var state = stateByPlayerIndex[i];
|
||||||
frozenActor = state.FrozenActor;
|
frozenActor = state.FrozenActor;
|
||||||
isVisible = !frozenActor.Visible;
|
isVisible = !frozenActor.Visible;
|
||||||
state.IsVisible = isVisible;
|
state.IsVisible = isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isVisible)
|
if (isVisible)
|
||||||
VisibilityHash += player.ClientIndex;
|
VisibilityHash |= 1 << (i % 32);
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user