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

相关文章

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是