1. 程式人生 > >egametang框架服務端運行流程

egametang框架服務端運行流程

實現 網絡 就會 類型 span object awake 函數 熱更新

技術分享

et框架的構建塊主要由entity和componet組成,類似unity的組件。一個Entity可以掛載多個不同Component。Entity和Component的共同基類Disposer用於提供對象池和事件機制。

Disposer創建時會被註冊進單例的ObjectEvents,如果它實現了ILoad,IUpdate,IStart,就會註冊進相應的列表,在ObjectEvents啟動,更新或者載入的時候觸發對應的事件處理方法(此方法在接口中定義)。

Disposer實現了IDisposable,在使用using或者手動調用Dispose之後會被對象池回收。

et框架的服務端啟動項目是app.proj 裏面只有一個帶main的program類型。et自定義了一個OneThreadSynchronizationContext,在有異步回調到來的時候保存delegate和參數到一個多線安全的隊列,然後在後面的主循環中調用update,在主線程中取出本次主循環產生的所有異步回調,從而保證了所有的回調函數都被捕捉到單一主線程執行。在主線程中多用await和async既符合順序的思考習慣,避免了很多的回調定義分散在多個函數中,又可以在等待某一異步操作完成時自動將執行權交給調用函數的後續代碼,避免了單線程主線掛起而永遠等不到回調完成的問題。單線程的架構既避免了各種多線編程的復雜性和問題陷阱,又可以在組織服務器集群時根據服務器cpu支持的線程數合理啟動數量相當的進程來充分發揮服務器計算能力,避免了過多線程造成的上下文切換開銷,有利於總體性能的提高。

et框架的啟動項目是App.proj,其中只有一個Program類,類中包含入口函數Main。

啟動之後首先註冊Model程序集中提供的各種基礎模型類,隨後加載Hotfix中可以熱更新的類型並且註冊到ObjectEvents。一方面是提供IAwake ILoad IUpdate接口中的事件處理,一方面檢索各類Attribute並且註冊到相應容器中以便後續查找。

Game.Scene是很重要的單例實體,其上的component代表了服務端進程能提供的基礎功能集合。

OptionComponent和StartConfigComponent用來讀取unity中設定的服務器集群配置,給後續的啟動步驟留下依據。

後續OpcodeTypeComponent和MessageDispatherComponent提供服務端進程相應網絡消息回調的功能,這個所有種類的服務端進程都需要。

隨後是根據本身的appid添加自身需要的Component。這些具體的組件後續的文章會繼續介紹。最後是進入服務端主循環:每此循環休息1ms防止CPU占用過高;處理發生的異步回調;處理各種IDisposer的update事件。

服務端的設計思路和基本運行流程就到這裏,後續會再介紹框架的其他方面。

egametang框架服務端運行流程