public static Activity RunActivity(Actor self, Activity act) { // Note - manual iteration here for performance due to high call volume. var longTickThresholdInStopwatchTicks = PerfTimer.LongTickThresholdInStopwatchTicks; var start = Stopwatch.GetTimestamp(); while (act != null) { var prev = act; act = act.Tick(self); var current = Stopwatch.GetTimestamp(); if (current - start > longTickThresholdInStopwatchTicks) { PerfTimer.LogLongTick(start, current, "Activity", prev); start = Stopwatch.GetTimestamp(); } else { start = current; } if (prev == act) { break; } } return(act); }
public static Activity RunActivity(Actor self, Activity act) { while (act != null) { var prev = act; var sw = new Stopwatch(); act = act.Tick(self); var dt = sw.ElapsedTime(); if (dt > Game.Settings.Debug.LongTickThreshold) { Log.Write("perf", "[{2}] Activity: {0} ({1:0.000} ms)", prev, dt * 1000, Game.LocalTick); } if (prev == act) { break; } } return(act); }
public static Activity RunActivity(Actor self, Activity act) { // PERF: If there are no activities we can bail straight away and save ourselves a call to // Stopwatch.GetTimestamp. if (act == null) { return(act); } // PERF: This is a hot path and must run with minimal added overhead. // Calling Stopwatch.GetTimestamp is a bit expensive, so we enumerate manually to allow us to call it only // once per iteration in the normal case. // See also: DoTimed var longTickThresholdInStopwatchTicks = PerfTimer.LongTickThresholdInStopwatchTicks; var start = Stopwatch.GetTimestamp(); while (act != null) { var prev = act; act = act.Tick(self); var current = Stopwatch.GetTimestamp(); if (current - start > longTickThresholdInStopwatchTicks) { PerfTimer.LogLongTick(start, current, "Activity", prev); start = Stopwatch.GetTimestamp(); } else { start = current; } if (prev == act) { break; } } return(act); }