天天看點

ET篇:master服務端學習(架構初始化流程的介紹)

講過master用戶端的架構初始化,再來說一下服務端的初始化流程吧,因為很多用戶端代碼在服務端是通用的,是以了解起來也不算困難,就像這樣

ET篇:master服務端學習(架構初始化流程的介紹)

先來到程式入口

ET篇:master服務端學習(架構初始化流程的介紹)

然後就是架構的初始化了(因為很多細節在用戶端那篇講過了,是以就不在這贅述了,内部實作是一樣的)

//添加Model.dll到字典維護
Game.EventSystem.Add(DLLType.Model, typeof(Game).Assembly);
//添加Hotfix.dll到字典維護
Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());
//添加并擷取設定元件的引用
Options options = Game.Scene.AddComponent<OptionComponent, string[]>(args).Options;
//添加并擷取初始配置的元件的引用
StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string, int>//判斷配置檔案是否正确
if (!options.AppType.Is(startConfig.AppType))
{
    Log.Error("指令行參數apptype與配置不一緻");
    return;
}
           
//增加計時器元件
Game.Scene.AddComponent<TimerComponent>();
//增加OpcodeType元件(是雙端通訊協定的重要組成部分)
Game.Scene.AddComponent<OpcodeTypeComponent>();
//增加消息分發元件(確定從服務端收到的消息能正确的送到到接受者手中)
Game.Scene.AddComponent<MessageDispatcherComponent>();
// 根據不同的AppType添加不同的元件
OuterConfig outerConfig = startConfig.GetComponent<OuterConfig>();
InnerConfig innerConfig = startConfig.GetComponent<InnerConfig>();
ClientConfig clientConfig = startConfig.GetComponent<ClientConfig>();
           

然後是最為重要的服務端元件的添加 ,這裡直接拿case AppType.AllServer:中的元件舉例,因為它幾乎包括了所有元件

// 發送普通actor消息
Game.Scene.AddComponent<ActorMessageSenderComponent>();
// 發送location actor消息
Game.Scene.AddComponent<ActorLocationSenderComponent>();
//添加MongoDB元件,處理與伺服器的互動
Game.Scene.AddComponent<DBComponent>();
//添加MongoDB代理元件,代理服務端對資料庫的操作
Game.Scene.AddComponent<DBProxyComponent>();
// 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>();
//添加機關元件(這是遊戲中物體的最小單元,繼承自Entity)
Game.Scene.AddComponent<UnitComponent>();
Game.Scene.AddComponent<ConsoleComponent>();
           

 最後通過while循環讓整個架構跑起來,線程沉睡一毫秒的作用是防止直接吃滿CPU

while (true)
				{
					try
					{
						Thread.Sleep(1);
						OneThreadSynchronizationContext.Instance.Update();
						Game.EventSystem.Update();
					}
					catch (Exception e)
					{
						Log.Error(e);
					}
				}