本文主要是介绍ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
-
OpcodeTypeComponent
OpcodeTypeComponent组件接入了Awake和Load两个事件,会在事件系统收集反射信息和该组件被创建时,执行Load方法。
该类中维护了一个字典Dictionary<ushort, object> typeMessages和一个DoubleMap<ushort, Type> opcodeTypes。字典中存储的是按照类别分的消息的类实例,这里的类型是按照特性进行了区分。typeMessages字典是客户端为了实现0GC所使用的对象池。
DoubleMap<K,V>是一个自定义的数据类型,应该也是为了减少GC而创建的。内部实现是维护了两个泛型字典。按照这个形
式来看,应该是用这两个字典互相转换。Add方法是分别将Key和Value按照正反顺序添加到两个字典中去。GetKeyByValue和GetValueByKey这两个方法就是分别从来个字典中获取相应的Value(就是分别获取了Key和Value)。此外,RemoveByKey和RemoveByValue,ContainsKey和Contains方法也是一样的实现思路。这里用来存储消息的特性类型和类的信息。
Load方法,获取到事件系统中存储的事件类型,获取到MessageAttribute特性的类型,添加到两个集合中去。注意,这时候的Key值是消息的识别码,如下图所示:
后面就是根据特性类别获取类型,和根据类型获取特性类别的方法。
-
MessageDispatherComponent消息分发组件
组件内部维护了一个Dictionary<ushort, List<IMHandler>> handlers字典,用于存储实现了IMHandler接口的事件对象。
该组件和OpcodeTypeComponent组件一样,也是接入了Awake和Load两个事件,会在事件系统收集反射信息和该组件被创建时,执行Load方法。Load方法和OpcodeTypeComponent组件实现思路一样,只不过获取的是MessageHandlerAttribute特性的类型。IMHandler接口中有一个GetMessageType方法,返回实现了IMHandler接口的类的消息识别码。Load方法中会根据该方法返回的类型信息在OpcodeTypeComponent组件的opcodeTypes中查找特性类别,如果该类型为不为0,则需要注册该类别的特性类型。RegisterHandler方法用于注册消息(特性)类型,将其保存在字典中。
对于IMHandler接口,目前实现该接口的就只有MessageProxy类,其内部保存了一个Type和一个Action参数,初始化该类的实例是会确定这两个参数。这样就确定了一个消息识别码类型和其对应的委托方法。
Handle方法用于执行指定的继承了实现了IMHandler接口的类的Handle方法。该方法的两个参数,Session和MessageInfo
两个类型,根据MessageInfo的Opcode属性,从字典中获取相应的值,遍历执行Handle方法
这里没有实际的例子,可能没有没有具体理清楚这个类的工作流程。
这篇关于ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!