Exemplo n.º 1
0
        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();
            }
        }