ET框架學習——OpcodeTypeComponent組件和MessageDispatherComponent組件

  • OpcodeTypeComponent

       OpcodeTypeComponent組件接入了Awake和Load兩個事件,會在事件系統收集反射信息和該組件被創建時,執行Load方法。

       該類中維護了一個字典Dictionary<ushort, object> typeMessages和一個DoubleMap<ushort, Type> opcodeTypes。字典中存儲的是按照類別分的消息的類實例,這裏的類型是按照特性進行了區分。

        DoubleMap<K,V>是一個自定義的數據類型,應該也是爲了減少GC而創建的。內部實現是維護了兩個泛型字典。按照這個形

泛型字典。

 式來看,應該是用這兩個字典互相轉換。Add方法是分別將K和V按照正反順序添加到兩個字典中去。GetKeyByValueGetValueByKey這兩個方法就是分別從來個字典中獲取相應的Value。此外,RemoveByKeyRemoveByValueContainsKeyContains方法也是一樣的實現思路。這裏用來存儲消息的特性類型和類的信息。

        Load方法,獲取到事件系統中存儲的事件類型,獲取到MessageAttribute特性的類型,添加到兩個集合中去。

        後面就是根據特性類別獲取類型,和根據類型獲取特性類別的方法。

  • MessageDispatherComponent消息分發組件

       組件內部維護了一個Dictionary<ushort, List<IMHandler>> handlers字典,用於存儲實現了IMHandler接口的事件對象。

       該組件和OpcodeTypeComponent組件一樣,也是接入了Awake和Load兩個事件,會在事件系統收集反射信息和該組件被創建時,執行Load方法。Load方法和OpcodeTypeComponent組件實現思路一樣,只不過獲取的是MessageHandlerAttribute特性的類型。IMHandler接口中有一個GetMessageType方法,返回實現IMHandler接口的類的類型信息,Load方法中會根據該方法返回的類型信息在OpcodeTypeComponent組件的opcodeTypes中查找特性類別,如果該類型爲不爲0,則需要註冊該類別的特性類型。RegisterHandler方法用於註冊消息(特性)類型,將其保存在字典中。 

       Handle方法用於執行指定的繼承了實現了IMHandler接口的類的Handle方法。該方法的兩個參數,SessionMessageInfo

兩個類型,根據MessageInfoOpcode屬性,從字典中獲取相應的值,遍歷執行Handle方法

      這裏沒有實際的例子,可能沒有沒有具體理清楚這個類的工作流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章