diff --git a/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs b/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs index 9201fe9aa..8dbcee776 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs @@ -350,7 +350,10 @@ namespace Barotrauma GameMain.LuaCs.Update(); GameMain.LuaCs.Hook.Call("think", new object[] { }); performanceCounterTimer.Stop(); - LuaCsTimer.LastUpdateTime = performanceCounterTimer.ElapsedMilliseconds; + if (GameMain.LuaCs.PerformanceCounter.EnablePerformanceCounter) + { + GameMain.LuaCs.PerformanceCounter.UpdateElapsedTime = (double)performanceCounterTimer.ElapsedTicks / Stopwatch.Frequency; + } performanceCounterTimer.Reset(); Timing.Accumulator -= Timing.Step; diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs index 0a3fb190b..34b587b56 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs @@ -8,6 +8,7 @@ using System.Text; using MoonSharp.Interpreter.Interop; using static Barotrauma.LuaCsSetup; using System.Threading; +using System.Diagnostics; namespace Barotrauma { @@ -372,6 +373,8 @@ namespace Barotrauma } + private Stopwatch performanceMeasurement = new Stopwatch(); + [MoonSharpHidden] public T Call(string name, params object[] args) { @@ -397,6 +400,11 @@ namespace Barotrauma { try { + if (GameMain.LuaCs.PerformanceCounter.EnablePerformanceCounter) + { + performanceMeasurement.Start(); + } + var result = tuple.Item1.func(args); if (result != null) { @@ -417,6 +425,13 @@ namespace Barotrauma else lastResult = (T)result; } } + + if (GameMain.LuaCs.PerformanceCounter.EnablePerformanceCounter) + { + performanceMeasurement.Stop(); + GameMain.LuaCs.PerformanceCounter.SetHookElapsedTicks(name, key, performanceMeasurement.ElapsedTicks); + performanceMeasurement.Reset(); + } } catch (Exception e) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsPerformanceCounter.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsPerformanceCounter.cs new file mode 100644 index 000000000..77c18a887 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsPerformanceCounter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Barotrauma +{ + public class LuaCsPerformanceCounter + { + public bool EnablePerformanceCounter = false; + + public double UpdateElapsedTime; + public Dictionary> HookElapsedTime = new Dictionary>(); + + public static float MemoryUsage + { + get + { + Process proc = Process.GetCurrentProcess(); + float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); + proc.Dispose(); + + return memory; + } + } + + public void SetHookElapsedTicks(string eventName, string hookName, long ticks) + { + if (!HookElapsedTime.ContainsKey(eventName)) + { + HookElapsedTime[eventName] = new Dictionary(); + } + + HookElapsedTime[eventName][hookName] = (double)ticks / Stopwatch.Frequency; + } + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index eb04932a2..57cb230d1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -54,15 +54,14 @@ namespace Barotrauma lua.Globals["CsScript"] = CsScript; } - public LuaGame Game { get; private set; } public LuaScriptLoader LuaScriptLoader { get; private set; } + public LuaGame Game { get; private set; } public LuaCsHook Hook { get; private set; } - public LuaCsTimer Timer { get; private set; } - public LuaCsNetworking Networking { get; private set; } public LuaCsSteam Steam { get; private set; } + public LuaCsPerformanceCounter PerformanceCounter { get; private set; } public LuaCsModStore ModStore { get; private set; } private LuaRequire require { get; set; } @@ -333,6 +332,7 @@ namespace Barotrauma Networking = new LuaCsNetworking(); Timer = new LuaCsTimer(); Steam = new LuaCsSteam(); + PerformanceCounter = new LuaCsPerformanceCounter(); LuaScriptLoader = null; lua = null; Lua = null; @@ -381,6 +381,7 @@ namespace Barotrauma Networking = new LuaCsNetworking(); Timer = new LuaCsTimer(); Steam = new LuaCsSteam(); + PerformanceCounter = new LuaCsPerformanceCounter(); Hook.Initialize(); ModStore.Initialize(); @@ -396,6 +397,7 @@ namespace Barotrauma UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); + UserData.RegisterType(); UserData.RegisterType(); lua.Globals["printerror"] = (Action)PrintError; @@ -418,6 +420,7 @@ namespace Barotrauma lua.Globals["File"] = UserData.CreateStatic(); lua.Globals["Networking"] = Networking; lua.Globals["Steam"] = Steam; + lua.Globals["PerformanceCounter"] = PerformanceCounter; lua.Globals["ExecutionNumber"] = executionNumber; lua.Globals["CSActive"] = csActive; diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs index e8cb210d4..f7790bf29 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs @@ -6,20 +6,8 @@ namespace Barotrauma { public class LuaCsTimer { - public static long LastUpdateTime = 0; - public static double Time => Timing.TotalTime; - public static double GetTime() => Time; - - public static float GetUsageMemory() - { - Process proc = Process.GetCurrentProcess(); - float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); - proc.Dispose(); - - return memory; - } private class TimerComparer : IComparer {