private static void Main(string[] args) { // 异步方法全部会回掉到主线程 SynchronizationContext.SetSynchronizationContext(OneThreadSynchronizationContext.Instance); try { Game.EventSystem.Add(DLLType.Model, typeof(Game).Assembly); Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly()); Options options = Game.Scene.AddComponent <OptionComponent, string[]>(args).Options; StartConfig startConfig = Game.Scene.AddComponent <StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig; if (!options.AppType.Is(startConfig.AppType)) { Log.Error("命令行参数apptype与配置不一致"); return; } IdGenerater.AppId = options.AppId; LogManager.Configuration.Variables["appType"] = $"{startConfig.AppType}"; LogManager.Configuration.Variables["appId"] = $"{startConfig.AppId}"; LogManager.Configuration.Variables["appTypeFormat"] = $"{startConfig.AppType, -8}"; LogManager.Configuration.Variables["appIdFormat"] = $"{startConfig.AppId:0000}"; Log.Info($"server start........................ {startConfig.AppId} {startConfig.AppType}"); Game.Scene.AddComponent <TimerComponent>(); Game.Scene.AddComponent <OpcodeTypeComponent>(); Game.Scene.AddComponent <MessageDispatcherComponent>(); // 根据不同的AppType添加不同的组件 OuterConfig outerConfig = startConfig.GetComponent <OuterConfig>(); InnerConfig innerConfig = startConfig.GetComponent <InnerConfig>(); ClientConfig clientConfig = startConfig.GetComponent <ClientConfig>(); switch (startConfig.AppType) { case AppType.Manager: Game.Scene.AddComponent <AppManagerComponent>(); Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address); break; case AppType.Realm: Game.Scene.AddComponent <MailboxDispatcherComponent>(); Game.Scene.AddComponent <ActorMessageDispatcherComponent>(); Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <RealmGateAddressComponent>(); break; case AppType.Gate: Game.Scene.AddComponent <PlayerComponent>(); Game.Scene.AddComponent <MailboxDispatcherComponent>(); Game.Scene.AddComponent <ActorMessageDispatcherComponent>(); Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <ActorMessageSenderComponent>(); Game.Scene.AddComponent <ActorLocationSenderComponent>(); Game.Scene.AddComponent <GateSessionKeyComponent>(); break; case AppType.Location: Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); Game.Scene.AddComponent <LocationComponent>(); break; case AppType.Map: Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); Game.Scene.AddComponent <UnitComponent>(); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <ActorMessageSenderComponent>(); Game.Scene.AddComponent <ActorLocationSenderComponent>(); Game.Scene.AddComponent <MailboxDispatcherComponent>(); Game.Scene.AddComponent <ActorMessageDispatcherComponent>(); Game.Scene.AddComponent <PathfindingComponent>(); break; case AppType.AllServer: Log.Info("allserver"); // 发送普通actor消息 Game.Scene.AddComponent <ActorMessageSenderComponent>(); // 发送location actor消息 Game.Scene.AddComponent <ActorLocationSenderComponent>(); Game.Scene.AddComponent <DBComponent>(); Game.Scene.AddComponent <DBProxyComponent>(); //协程锁组件 Game.Scene.AddComponent <CoroutineLockComponent>(); // location server需要的组件 Game.Scene.AddComponent <LocationComponent>(); // 访问location server的组件 Game.Scene.AddComponent <LocationProxyComponent>(); // 这两个组件是处理actor消息使用的 Game.Scene.AddComponent <MailboxDispatcherComponent>(); Game.Scene.AddComponent <ActorMessageDispatcherComponent>(); // 内网消息组件 Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address); // 外网消息组件 Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address); // manager server组件,用来管理其它进程使用 Game.Scene.AddComponent <AppManagerComponent>(); Game.Scene.AddComponent <RealmGateAddressComponent>(); Game.Scene.AddComponent <GateSessionKeyComponent>(); // 配置管理 Game.Scene.AddComponent <ConfigComponent>(); // recast寻路组件 Game.Scene.AddComponent <PathfindingComponent>(); Game.Scene.AddComponent <PlayerComponent>(); Game.Scene.AddComponent <UnitComponent>(); Game.Scene.AddComponent <ConsoleComponent>(); Game.Scene.AddComponent <HttpComponent>(); break; case AppType.Benchmark: Game.Scene.AddComponent <NetOuterComponent>(); Game.Scene.AddComponent <BenchmarkComponent, string>(clientConfig.Address); break; case AppType.BenchmarkWebsocketServer: Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address); break; case AppType.BenchmarkWebsocketClient: Game.Scene.AddComponent <NetOuterComponent>(); Game.Scene.AddComponent <WebSocketBenchmarkComponent, string>(clientConfig.Address); break; default: throw new Exception($"命令行参数没有设置正确的AppType: {startConfig.AppType}"); } while (true) { try { Thread.Sleep(1); OneThreadSynchronizationContext.Instance.Update(); Game.EventSystem.Update(); } catch (Exception e) { Log.Error(e); } } } catch (Exception e) { Log.Error(e); } }
private static void Main(string[] args) { // 异步方法全部会回掉到主线程 OneThreadSynchronizationContext contex = new OneThreadSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(contex); MongoHelper.Init(); try { Game.EventSystem.Add(DLLType.Model, typeof(Game).Assembly); Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly()); Options options = Game.Scene.AddComponent <OptionComponent, string[]>(args).Options; StartConfig startConfig = Game.Scene.AddComponent <StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig; if (!options.AppType.Is(startConfig.AppType)) { Log.Error("命令行参数apptype与配置不一致"); return; } IdGenerater.AppId = options.AppId; LogManager.Configuration.Variables["appType"] = startConfig.AppType.ToString(); LogManager.Configuration.Variables["appId"] = startConfig.AppId.ToString(); LogManager.Configuration.Variables["appTypeFormat"] = $"{startConfig.AppType,-8}"; LogManager.Configuration.Variables["appIdFormat"] = $"{startConfig.AppId:D3}"; Log.Info($"server start........................ {startConfig.AppId} {startConfig.AppType}"); Game.Scene.AddComponent <OpcodeTypeComponent>(); Game.Scene.AddComponent <MessageDispatherComponent>(); // 根据不同的AppType添加不同的组件 OuterConfig outerConfig = startConfig.GetComponent <OuterConfig>(); InnerConfig innerConfig = startConfig.GetComponent <InnerConfig>(); ClientConfig clientConfig = startConfig.GetComponent <ClientConfig>(); switch (startConfig.AppType) { case AppType.Manager: Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <NetOuterComponent, IPEndPoint>(outerConfig.IPEndPoint); Game.Scene.AddComponent <AppManagerComponent>(); break; case AppType.Realm: Game.Scene.AddComponent <ActorMessageDispatherComponent>(); Game.Scene.AddComponent <ActorManagerComponent>(); Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <NetOuterComponent, IPEndPoint>(outerConfig.IPEndPoint); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <RealmGateAddressComponent>(); break; case AppType.Gate: Game.Scene.AddComponent <PlayerComponent>(); Game.Scene.AddComponent <ActorMessageDispatherComponent>(); Game.Scene.AddComponent <ActorManagerComponent>(); Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <NetOuterComponent, IPEndPoint>(outerConfig.IPEndPoint); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <ActorProxyComponent>(); Game.Scene.AddComponent <GateSessionKeyComponent>(); break; case AppType.Location: Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <LocationComponent>(); break; case AppType.Map: Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <ActorManagerComponent>(); Game.Scene.AddComponent <UnitComponent>(); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <ActorProxyComponent>(); Game.Scene.AddComponent <ActorMessageDispatherComponent>(); Game.Scene.AddComponent <ServerFrameComponent>(); break; case AppType.AllServer: Game.Scene.AddComponent <ActorProxyComponent>(); Game.Scene.AddComponent <PlayerComponent>(); Game.Scene.AddComponent <UnitComponent>(); Game.Scene.AddComponent <DBComponent>(); Game.Scene.AddComponent <DBProxyComponent>(); Game.Scene.AddComponent <DBCacheComponent>(); Game.Scene.AddComponent <LocationComponent>(); Game.Scene.AddComponent <ActorMessageDispatherComponent>(); Game.Scene.AddComponent <ActorManagerComponent>(); Game.Scene.AddComponent <NetInnerComponent, IPEndPoint>(innerConfig.IPEndPoint); Game.Scene.AddComponent <NetOuterComponent, IPEndPoint>(outerConfig.IPEndPoint); Game.Scene.AddComponent <LocationProxyComponent>(); Game.Scene.AddComponent <AppManagerComponent>(); Game.Scene.AddComponent <RealmGateAddressComponent>(); Game.Scene.AddComponent <GateSessionKeyComponent>(); Game.Scene.AddComponent <ConfigComponent>(); Game.Scene.AddComponent <ServerFrameComponent>(); break; case AppType.Benchmark: Game.Scene.AddComponent <NetOuterComponent>(); Game.Scene.AddComponent <BenchmarkComponent, IPEndPoint>(clientConfig.IPEndPoint); break; default: throw new Exception($"命令行参数没有设置正确的AppType: {startConfig.AppType}"); } while (true) { try { Thread.Sleep(1); contex.Update(); Game.EventSystem.Update(); } catch (Exception e) { Log.Error(e.ToString()); } } } catch (Exception e) { Log.Error(e.ToString()); } }