From 91ea3532b434e170c300a52c9de016c6921d97d8 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Fri, 27 Nov 2015 15:22:47 +0000 Subject: [PATCH] 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. --- .../Traits/Modifiers/FrozenUnderFog.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs index adc068fb4f..d1bb72ee2d 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs @@ -37,6 +37,7 @@ namespace OpenRA.Mods.Common.Traits readonly Dictionary stateByPlayer = new Dictionary(); + FrozenState[] stateByPlayerIndex; ITooltip tooltip; Health health; bool initialized; @@ -87,34 +88,40 @@ namespace OpenRA.Mods.Common.Traits return; VisibilityHash = 0; + var players = self.World.Players; if (!initialized) { + // The world players never change, so we can safely index this collection. + stateByPlayerIndex = new FrozenState[players.Length]; tooltip = self.TraitsImplementing().FirstOrDefault(); health = self.TraitOrDefault(); } - foreach (var player in self.World.Players) + for (var i = 0; i < players.Length; i++) { FrozenActor frozenActor; bool isVisible; if (!initialized) { + var player = players[i]; frozenActor = new FrozenActor(self, footprint, player.Shroud, 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().Add(frozenActor); } else { - var state = stateByPlayer[player]; + var state = stateByPlayerIndex[i]; frozenActor = state.FrozenActor; isVisible = !frozenActor.Visible; state.IsVisible = isVisible; } if (isVisible) - VisibilityHash += player.ClientIndex; + VisibilityHash |= 1 << (i % 32); else continue;