namespace Supercell.Laser.Server { using Supercell.Laser.Server.Handler; using Supercell.Laser.Server.Settings; using Supercell.Laser.Server.Networking.Session; using System.Drawing; using System; using System.Diagnostics; using System.IO; using System.Runtime; using System.Text; using System.Text.Json; using Supercell.Laser.Server.Utils; static class Program { public static string SERVER_VERSION; public static int BattlesCompleted; private static void Main(string[] args) { // Fix 7: прогрев пула потоков до разумного минимума. // Без SetMinThreads ThreadPool добавляет потоки по одному в секунду — // при первых волнах подключений это создаёт задержки обработки. // Processor.cs уже создаёт cores + cores/2 своих Task, поэтому задаём // минимум с запасом на IOCP-потоки и случайные всплески. int processorCount = Environment.ProcessorCount; ThreadPool.SetMinThreads(processorCount * 4, processorCount * 2); Directory.SetCurrentDirectory(AppContext.BaseDirectory); Colorful.Console.WriteWithGradient( @" ____ __ _____ __ / __ )_________ __ __/ / / ___// /_____ ___________ / __ / ___/ __ `/ | /| / / / \__ \/ __/ __ `/ ___/ ___/ / /_/ / / / /_/ /| |/ |/ / / ___/ / /_/ /_/ / / (__ ) /_____/_/ \__,_/ |__/|__/_/ /____/\__/\__,_/_/ /____/ " + "\n\n\n", Color.Fuchsia, Color.Cyan, 8); Logger.Init(); ServerDataStore.Init(); SERVER_VERSION = ServerDataStore.GetServerVersion(); BattlesCompleted = ServerDataStore.GetBattlesCompletedCount(); Console.Title = $"Supercell.Laser.Server - {SERVER_VERSION}"; Configuration.Instance = Configuration.LoadFromFile("config.json"); Resources.InitDatabase(); Resources.InitLogic(); Resources.InitNetwork(); GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(2, GCCollectionMode.Aggressive, true, true); GC.WaitForPendingFinalizers(); GC.Collect(2, GCCollectionMode.Aggressive, true, true); DefenderLauncher.EnsureRunning(); if (Configuration.Instance.BotEnabled) { try { Supercell.Laser.Bot.Start.Run(new Supercell.Laser.Bot.ServerLink { DatabaseUsername = Configuration.Instance.DatabaseUsername, DatabasePassword = Configuration.Instance.DatabasePassword, DatabaseName = Configuration.Instance.DatabaseName, GetOnlineCount = () => Sessions.Count, GetPlayer = BotBridge.GetPlayer, ChangeGems = BotBridge.ChangeGems, ChangeGold = BotBridge.ChangeGold }); } catch (Exception e) { Logger.Print($"[Bot] не удалось запустить: {e.Message}"); } } Supercell.Laser.Logic.Battle.CommunityEvent.Load(); Logger.Print("Server started! Let's play Brawl Stars!"); ExitHandler.Init(); CmdHandler.Start(); } } }