-
OpcodeTypeComponent
OpcodeTypeComponent組件接入了Awake和Load兩個事件,會在事件系統收集反射信息和該組件被創建時,執行Load方法。
該類中維護了一個字典Dictionary<ushort, object> typeMessages和一個DoubleMap<ushort, Type> opcodeTypes。字典中存儲的是按照類別分的消息的類實例,這裏的類型是按照特性進行了區分。
DoubleMap<K,V>是一個自定義的數據類型,應該也是爲了減少GC而創建的。內部實現是維護了兩個泛型字典。按照這個形
式來看,應該是用這兩個字典互相轉換。Add方法是分別將K和V按照正反順序添加到兩個字典中去。GetKeyByValue和GetValueByKey這兩個方法就是分別從來個字典中獲取相應的Value。此外,RemoveByKey和RemoveByValue,ContainsKey和Contains方法也是一樣的實現思路。這裏用來存儲消息的特性類型和類的信息。
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方法。該方法的兩個參數,Session和MessageInfo
兩個類型,根據MessageInfo的Opcode屬性,從字典中獲取相應的值,遍歷執行Handle方法
這裏沒有實際的例子,可能沒有沒有具體理清楚這個類的工作流程。