From eb1e325fe2d3db809989be286f494eb619e4e2e1 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 26 Jul 2010 20:44:47 +1200 Subject: [PATCH] More caching --- OpenRA.Game/Traits/Mobile.cs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 5384bb5f78..5cd0a87d6e 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -59,11 +59,23 @@ namespace OpenRA.Traits } Shroud shroud; + UnitInfluence uim; + UnitInfo unitInfo; + BuildingInfluence bim; + bool canShareCell; + public Mobile(ActorInitializer init, MobileInfo info) { this.self = init.self; this.Info = info; this.__fromCell = this.__toCell = init.location; + + shroud = self.World.WorldActor.traits.Get(); + uim = self.World.WorldActor.traits.Get(); + bim = self.World.WorldActor.traits.Get(); + unitInfo = self.Info.Traits.GetOrDefault(); + canShareCell = self.traits.Contains(); + AddInfluence(); TerrainCost = new Dictionary(); @@ -77,7 +89,6 @@ namespace OpenRA.Traits TerrainCost.Add(info.TerrainTypes[i], 1f/info.TerrainSpeeds[i]); TerrainSpeed.Add(info.TerrainTypes[i], info.TerrainSpeeds[i]); } - shroud = self.World.WorldActor.traits.Get(); } public void SetPosition(Actor self, int2 cell) @@ -160,7 +171,7 @@ namespace OpenRA.Traits public virtual bool CanEnterCell(int2 cell, Actor ignoreActor, bool checkTransientActors) { // Check for buildings - var building = self.World.WorldActor.traits.Get().GetBuildingBlocking(cell); + var building = bim.GetBuildingBlocking(cell); if (building != null && building != ignoreActor) { if (Info.Crushes == null) @@ -177,10 +188,9 @@ namespace OpenRA.Traits // Check mobile actors if (checkTransientActors) { - var canShare = self.traits.Contains(); - var actors = self.World.WorldActor.traits.Get().GetUnitsAt(cell).Where(a => a != self && a != ignoreActor); - var nonshareable = actors.Where(a => !(canShare && a.traits.Contains())); - var shareable = actors.Where(a => canShare && a.traits.Contains()); + var actors = uim.GetUnitsAt(cell).Where(a => a != self && a != ignoreActor); + var nonshareable = actors.Where(a => !(canShareCell && a.traits.Contains())); + var shareable = actors.Where(a => canShareCell && a.traits.Contains()); // only allow 5 in a cell if (shareable.Count() >= 5) @@ -200,7 +210,7 @@ namespace OpenRA.Traits public virtual void FinishedMoving(Actor self) { - var crushable = self.World.WorldActor.traits.Get().GetUnitsAt(self.Location).Where(a => a != self && a.traits.Contains()); + var crushable = uim.GetUnitsAt(self.Location).Where(a => a != self && a.traits.Contains()); foreach (var a in crushable) { var crushActions = a.traits.WithInterface().Where(b => b.CrushClasses.Intersect(Info.Crushes).Any()); @@ -220,7 +230,6 @@ namespace OpenRA.Traits public virtual float MovementSpeedForCell(Actor self, int2 cell) { - var unitInfo = self.Info.Traits.GetOrDefault(); if( unitInfo == null ) return 0f; @@ -243,12 +252,12 @@ namespace OpenRA.Traits public virtual void AddInfluence() { - self.World.WorldActor.traits.Get().Add( self, this ); + uim.Add( self, this ); } public virtual void RemoveInfluence() { - self.World.WorldActor.traits.Get().Remove( self, this ); + uim.Remove( self, this ); } public void OnNudge(Actor self, Actor nudger)