ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件

本文主要是介绍ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • OpcodeTypeComponent

       OpcodeTypeComponent组件接入了Awake和Load两个事件,会在事件系统收集反射信息和该组件被创建时,执行Load方法。

       该类中维护了一个字典Dictionary<ushort, object> typeMessages和一个DoubleMap<ushort, Type> opcodeTypes。字典中存储的是按照类别分的消息的类实例,这里的类型是按照特性进行了区分。typeMessages字典是客户端为了实现0GC所使用的对象池。

        DoubleMap<K,V>是一个自定义的数据类型,应该也是为了减少GC而创建的。内部实现是维护了两个泛型字典。按照这个形

泛型字典。

 式来看,应该是用这两个字典互相转换。Add方法是分别将KeyValue按照正反顺序添加到两个字典中去。GetKeyByValueGetValueByKey这两个方法就是分别从来个字典中获取相应的Value(就是分别获取了KeyValue)。此外,RemoveByKeyRemoveByValueContainsKeyContains方法也是一样的实现思路。这里用来存储消息的特性类型和类的信息。

        Load方法,获取到事件系统中存储的事件类型,获取到MessageAttribute特性的类型,添加到两个集合中去。注意,这时候的Key值是消息的识别码,如下图所示:

如下图所示:

        后面就是根据特性类别获取类型,和根据类型获取特性类别的方法。

  • MessageDispatherComponent消息分发组件

       组件内部维护了一个Dictionary<ushort, List<IMHandler>> handlers字典,用于存储实现了IMHandler接口的事件对象。

       该组件和OpcodeTypeComponent组件一样,也是接入了AwakeLoad两个事件,会在事件系统收集反射信息和该组件被创建时,执行Load方法。Load方法和OpcodeTypeComponent组件实现思路一样,只不过获取的是MessageHandlerAttribute特性的类型。IMHandler接口中有一个GetMessageType方法,返回实现了IMHandler接口的类的消息识别码。Load方法中会根据该方法返回的类型信息在OpcodeTypeComponent组件的opcodeTypes中查找特性类别,如果该类型为不为0,则需要注册该类别的特性类型。RegisterHandler方法用于注册消息(特性)类型,将其保存在字典中。 

       对于IMHandler接口,目前实现该接口的就只有MessageProxy类,其内部保存了一个Type和一个Action参数,初始化该类的实例是会确定这两个参数。这样就确定了一个消息识别码类型和其对应的委托方法。

       Handle方法用于执行指定的继承了实现了IMHandler接口的类的Handle方法。该方法的两个参数,SessionMessageInfo

两个类型,根据MessageInfoOpcode属性,从字典中获取相应的值,遍历执行Handle方法

      这里没有实际的例子,可能没有没有具体理清楚这个类的工作流程。

这篇关于ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910003

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom