From 422ba16ed9be60a06a4e49fa39c589db925b3500 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Mon, 1 Oct 2018 19:39:01 +0200 Subject: [PATCH] Run TickIdle from inside Actor.Tick instead of World.Tick Avoids calling ActorsWithTrait every tick and allows caching all INotifyIdle traits at creation. --- OpenRA.Game/Actor.cs | 5 +++++ OpenRA.Game/World.cs | 7 +------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index f5bfca8f6f..b44d1bd23e 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -77,6 +77,7 @@ namespace OpenRA readonly IMouseBounds[] mouseBounds; readonly IVisibilityModifier[] visibilityModifiers; readonly IDefaultVisibility defaultVisibility; + readonly INotifyIdle[] tickIdles; readonly ITargetablePositions[] targetablePositions; WPos[] staticTargetablePositions; @@ -119,6 +120,7 @@ namespace OpenRA mouseBounds = TraitsImplementing().ToArray(); visibilityModifiers = TraitsImplementing().ToArray(); defaultVisibility = Trait(); + tickIdles = TraitsImplementing().ToArray(); Targetables = TraitsImplementing().ToArray(); targetablePositions = TraitsImplementing().ToArray(); world.AddFrameEndTask(w => @@ -141,6 +143,9 @@ namespace OpenRA if (!wasIdle && IsIdle) foreach (var n in TraitsImplementing()) n.OnBecomingIdle(this); + else if (wasIdle) + foreach (var tickIdle in tickIdles) + tickIdle.TickIdle(this); } public IEnumerable Render(WorldRenderer wr) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index b6328fb9f1..4241db482c 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -355,12 +355,7 @@ namespace OpenRA { WorldTick++; - using (new PerfSample("tick_idle")) - foreach (var ni in ActorsWithTrait()) - if (ni.Actor.IsIdle) - ni.Trait.TickIdle(ni.Actor); - - using (new PerfSample("tick_activities")) + using (new PerfSample("tick_actors")) foreach (var a in actors.Values) a.Tick();