Run TickIdle from inside Actor.Tick instead of World.Tick
Avoids calling ActorsWithTrait<INotifyIdle> every tick and allows caching all INotifyIdle traits at creation.
This commit is contained in:
@@ -77,6 +77,7 @@ namespace OpenRA
|
|||||||
readonly IMouseBounds[] mouseBounds;
|
readonly IMouseBounds[] mouseBounds;
|
||||||
readonly IVisibilityModifier[] visibilityModifiers;
|
readonly IVisibilityModifier[] visibilityModifiers;
|
||||||
readonly IDefaultVisibility defaultVisibility;
|
readonly IDefaultVisibility defaultVisibility;
|
||||||
|
readonly INotifyIdle[] tickIdles;
|
||||||
readonly ITargetablePositions[] targetablePositions;
|
readonly ITargetablePositions[] targetablePositions;
|
||||||
WPos[] staticTargetablePositions;
|
WPos[] staticTargetablePositions;
|
||||||
|
|
||||||
@@ -119,6 +120,7 @@ namespace OpenRA
|
|||||||
mouseBounds = TraitsImplementing<IMouseBounds>().ToArray();
|
mouseBounds = TraitsImplementing<IMouseBounds>().ToArray();
|
||||||
visibilityModifiers = TraitsImplementing<IVisibilityModifier>().ToArray();
|
visibilityModifiers = TraitsImplementing<IVisibilityModifier>().ToArray();
|
||||||
defaultVisibility = Trait<IDefaultVisibility>();
|
defaultVisibility = Trait<IDefaultVisibility>();
|
||||||
|
tickIdles = TraitsImplementing<INotifyIdle>().ToArray();
|
||||||
Targetables = TraitsImplementing<ITargetable>().ToArray();
|
Targetables = TraitsImplementing<ITargetable>().ToArray();
|
||||||
targetablePositions = TraitsImplementing<ITargetablePositions>().ToArray();
|
targetablePositions = TraitsImplementing<ITargetablePositions>().ToArray();
|
||||||
world.AddFrameEndTask(w =>
|
world.AddFrameEndTask(w =>
|
||||||
@@ -141,6 +143,9 @@ namespace OpenRA
|
|||||||
if (!wasIdle && IsIdle)
|
if (!wasIdle && IsIdle)
|
||||||
foreach (var n in TraitsImplementing<INotifyBecomingIdle>())
|
foreach (var n in TraitsImplementing<INotifyBecomingIdle>())
|
||||||
n.OnBecomingIdle(this);
|
n.OnBecomingIdle(this);
|
||||||
|
else if (wasIdle)
|
||||||
|
foreach (var tickIdle in tickIdles)
|
||||||
|
tickIdle.TickIdle(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
||||||
|
|||||||
@@ -355,12 +355,7 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
WorldTick++;
|
WorldTick++;
|
||||||
|
|
||||||
using (new PerfSample("tick_idle"))
|
using (new PerfSample("tick_actors"))
|
||||||
foreach (var ni in ActorsWithTrait<INotifyIdle>())
|
|
||||||
if (ni.Actor.IsIdle)
|
|
||||||
ni.Trait.TickIdle(ni.Actor);
|
|
||||||
|
|
||||||
using (new PerfSample("tick_activities"))
|
|
||||||
foreach (var a in actors.Values)
|
foreach (var a in actors.Values)
|
||||||
a.Tick();
|
a.Tick();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user