static async Task StartServerAsync() { DateTime lastDMECheck = DateTime.UtcNow; DateTime lastConfigRefresh = DateTime.UtcNow; Stopwatch tickSw = new Stopwatch(); #if DEBUG Stopwatch sw = new Stopwatch(); int ticks = 0; #endif Logger.Info("Starting medius components..."); Logger.Info($"Starting TCP on port {TcpServer.Port}."); TcpServer.Start(); Logger.Info($"TCP started."); await Manager.Start(); // Logger.Info("Started."); new Thread(new ParameterizedThreadStart(async(s) => { Stopwatch udpTickSw = new Stopwatch(); while (_isRunning) { // Restart stopwatch udpTickSw.Restart(); try { Plugins.OnEvent(PluginEvent.DME_UDP_TICK, null); // await Manager.TickUdp(); } catch (Exception e) { Logger.Error(e); } // Sleep await Task.Delay((int)Math.Max(0, _udpSleepMs - udpTickSw.ElapsedMilliseconds)); } })).Start(); try { #if DEBUG sw.Start(); #endif while (true) { #if DEBUG ++ticks; if (sw.Elapsed.TotalSeconds > 5f) { // sw.Stop(); float tps = ticks / (float)sw.Elapsed.TotalSeconds; float error = MathF.Abs(Settings.TickRate - tps) / Settings.TickRate; if (error > 0.1f) { Logger.Error($"Average TPS: {tps} is {error * 100}% off of target {Settings.TickRate}"); } sw.Restart(); ticks = 0; } #endif // tickSw.Restart(); // Check if connected if (Manager.IsConnected) { // Tick await TcpServer.Tick(); // Tick manager await Manager.Tick(); // Tick plugins Plugins.Tick(); // Send await TcpServer.SendQueue(); } else if ((DateTime.UtcNow - Manager.TimeLostConnection)?.TotalSeconds > Settings.MPSReconnectInterval) { // Try to reconnect to the proxy server await Manager.Start(); } // Reload config if ((DateTime.UtcNow - lastConfigRefresh).TotalMilliseconds > Settings.RefreshConfigInterval) { RefreshConfig(); lastConfigRefresh = DateTime.UtcNow; } await Task.Delay((int)Math.Max(0, _sleepMS - tickSw.ElapsedMilliseconds)); } } finally { _isRunning = false; await TcpServer.Stop(); await Manager.Stop(); } }