Add a method to look up actors by ID.
This can be used to speed up some methods.
This commit is contained in:
@@ -72,7 +72,7 @@ namespace OpenRA
|
|||||||
var subjectId = r.ReadUInt32();
|
var subjectId = r.ReadUInt32();
|
||||||
var flags = (OrderFields)r.ReadByte();
|
var flags = (OrderFields)r.ReadByte();
|
||||||
|
|
||||||
var targetActorId = flags.HasField(OrderFields.TargetActor) ? r.ReadUInt32() : 0xffffffff;
|
var targetActorId = flags.HasField(OrderFields.TargetActor) ? r.ReadUInt32() : uint.MaxValue;
|
||||||
var targetLocation = (CPos)(flags.HasField(OrderFields.TargetLocation) ? r.ReadInt2() : int2.Zero);
|
var targetLocation = (CPos)(flags.HasField(OrderFields.TargetLocation) ? r.ReadInt2() : int2.Zero);
|
||||||
var targetString = flags.HasField(OrderFields.TargetString) ? r.ReadString() : null;
|
var targetString = flags.HasField(OrderFields.TargetString) ? r.ReadString() : null;
|
||||||
var queued = flags.HasField(OrderFields.Queued);
|
var queued = flags.HasField(OrderFields.Queued);
|
||||||
@@ -104,28 +104,20 @@ namespace OpenRA
|
|||||||
|
|
||||||
static uint UIntFromActor(Actor a)
|
static uint UIntFromActor(Actor a)
|
||||||
{
|
{
|
||||||
if (a == null) return 0xffffffff;
|
if (a == null) return uint.MaxValue;
|
||||||
return a.ActorID;
|
return a.ActorID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool TryGetActorFromUInt(World world, uint aID, out Actor ret)
|
static bool TryGetActorFromUInt(World world, uint aID, out Actor ret)
|
||||||
{
|
{
|
||||||
if (aID == 0xFFFFFFFF)
|
if (aID == uint.MaxValue)
|
||||||
{
|
{
|
||||||
ret = null;
|
ret = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (var a in world.Actors.Where(x => x.ActorID == aID))
|
|
||||||
{
|
|
||||||
ret = a;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = null;
|
ret = world.GetActorById(aID);
|
||||||
return false;
|
return ret != null;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Named constructors for Orders.
|
// Named constructors for Orders.
|
||||||
|
|||||||
@@ -26,15 +26,8 @@ namespace OpenRA
|
|||||||
|
|
||||||
public sealed class World : IDisposable
|
public sealed class World : IDisposable
|
||||||
{
|
{
|
||||||
class ActorIDComparer : IComparer<Actor>
|
|
||||||
{
|
|
||||||
public static readonly ActorIDComparer Instance = new ActorIDComparer();
|
|
||||||
ActorIDComparer() { }
|
|
||||||
public int Compare(Actor x, Actor y) { return x.ActorID.CompareTo(y.ActorID); }
|
|
||||||
}
|
|
||||||
|
|
||||||
internal readonly TraitDictionary TraitDict = new TraitDictionary();
|
internal readonly TraitDictionary TraitDict = new TraitDictionary();
|
||||||
readonly SortedSet<Actor> actors = new SortedSet<Actor>(ActorIDComparer.Instance);
|
readonly SortedDictionary<uint, Actor> actors = new SortedDictionary<uint, Actor>();
|
||||||
readonly List<IEffect> effects = new List<IEffect>();
|
readonly List<IEffect> effects = new List<IEffect>();
|
||||||
readonly Queue<Action<World>> frameEndActions = new Queue<Action<World>>();
|
readonly Queue<Action<World>> frameEndActions = new Queue<Action<World>>();
|
||||||
|
|
||||||
@@ -225,7 +218,7 @@ namespace OpenRA
|
|||||||
public void Add(Actor a)
|
public void Add(Actor a)
|
||||||
{
|
{
|
||||||
a.IsInWorld = true;
|
a.IsInWorld = true;
|
||||||
actors.Add(a);
|
actors.Add(a.ActorID, a);
|
||||||
ActorAdded(a);
|
ActorAdded(a);
|
||||||
|
|
||||||
foreach (var t in a.TraitsImplementing<INotifyAddedToWorld>())
|
foreach (var t in a.TraitsImplementing<INotifyAddedToWorld>())
|
||||||
@@ -235,7 +228,7 @@ namespace OpenRA
|
|||||||
public void Remove(Actor a)
|
public void Remove(Actor a)
|
||||||
{
|
{
|
||||||
a.IsInWorld = false;
|
a.IsInWorld = false;
|
||||||
actors.Remove(a);
|
actors.Remove(a.ActorID);
|
||||||
ActorRemoved(a);
|
ActorRemoved(a);
|
||||||
|
|
||||||
foreach (var t in a.TraitsImplementing<INotifyRemovedFromWorld>())
|
foreach (var t in a.TraitsImplementing<INotifyRemovedFromWorld>())
|
||||||
@@ -283,7 +276,7 @@ namespace OpenRA
|
|||||||
ni.Trait.TickIdle(ni.Actor);
|
ni.Trait.TickIdle(ni.Actor);
|
||||||
|
|
||||||
using (new PerfSample("tick_activities"))
|
using (new PerfSample("tick_activities"))
|
||||||
foreach (var a in actors)
|
foreach (var a in actors.Values)
|
||||||
a.Tick();
|
a.Tick();
|
||||||
|
|
||||||
ActorsWithTrait<ITick>().DoTimed(x => x.Trait.Tick(x.Actor), "Trait");
|
ActorsWithTrait<ITick>().DoTimed(x => x.Trait.Tick(x.Actor), "Trait");
|
||||||
@@ -301,9 +294,17 @@ namespace OpenRA
|
|||||||
ActorsWithTrait<ITickRender>().DoTimed(x => x.Trait.TickRender(wr, x.Actor), "Render");
|
ActorsWithTrait<ITickRender>().DoTimed(x => x.Trait.TickRender(wr, x.Actor), "Render");
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<Actor> Actors { get { return actors; } }
|
public IEnumerable<Actor> Actors { get { return actors.Values; } }
|
||||||
public IEnumerable<IEffect> Effects { get { return effects; } }
|
public IEnumerable<IEffect> Effects { get { return effects; } }
|
||||||
|
|
||||||
|
public Actor GetActorById(uint actorId)
|
||||||
|
{
|
||||||
|
Actor a;
|
||||||
|
if (actors.TryGetValue(actorId, out a))
|
||||||
|
return a;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
uint nextAID = 0;
|
uint nextAID = 0;
|
||||||
internal uint NextAID()
|
internal uint NextAID()
|
||||||
{
|
{
|
||||||
@@ -367,7 +368,7 @@ namespace OpenRA
|
|||||||
Sound.StopVideo();
|
Sound.StopVideo();
|
||||||
|
|
||||||
// Dispose newer actors first, and the world actor last
|
// Dispose newer actors first, and the world actor last
|
||||||
foreach (var a in actors.Reverse())
|
foreach (var a in actors.Values.Reverse())
|
||||||
a.Dispose();
|
a.Dispose();
|
||||||
|
|
||||||
// Actor disposals are done in a FrameEndTask
|
// Actor disposals are done in a FrameEndTask
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
/* create a group */
|
/* create a group */
|
||||||
var actors = order.TargetString.Split(',')
|
var actors = order.TargetString.Split(',')
|
||||||
.Select(id => uint.Parse(id, NumberStyles.Any, NumberFormatInfo.InvariantInfo))
|
.Select(id => uint.Parse(id, NumberStyles.Any, NumberFormatInfo.InvariantInfo))
|
||||||
.Select(id => self.World.Actors.FirstOrDefault(a => a.ActorID == id))
|
.Select(id => self.World.GetActorById(id))
|
||||||
.Where(a => a != null);
|
.Where(a => a != null);
|
||||||
|
|
||||||
new Group(actors);
|
new Group(actors);
|
||||||
|
|||||||
Reference in New Issue
Block a user