8-登录流程

在AppStartInitFinish_CreateLoginUI.初始化后,执行Login界面的初始化

登录面板逻辑:UILoginComponentSystem,针对组件UILoginComponent创建的System

登录面板逻辑:UILoginComponent

逻辑层: LoginHelper中的clientSenderComponent.LoginAsync()是整个连接的过程。

网络层:ClientSenderComponentSystem使用Call(xxx)发送网络消息 Main2NetClient_Login()

在这里插入图片描述
找到消息的处理类,一般为(网络消息名字)_Handler,如Main2NetClient_LoginHandler,需要继承
MessageHandler(网络消息处理基类),并且带有请求的网络消息与回复的网络消息,并且带有
[MessageHandler(SceneType.NetClient)],在Run()函数中,做了如下事情:
1-移除并添加与初始化RouterAddressComponent(路由地址组件),在ConstValue中设置的连接ip与端口,并通过路由地址组件获取realm地址,
2-添加NetComponent(网络组件),并创建session,通过session.Call()发送网络消息,它的返回值就是回复的网络消息(异步)
3-创建gateSession,连接网关服务器,后续与游戏服务器通讯的时候,都是使用这个GateSession,使用gateSession的Call(),来向网关服务器请求登录。
这里只配置了一台Realm服务器,在正式部署时,为了分散性能压力,会配置多台,获取Reaml地址时,就会有多个地址。

服务端如何处理gateSession的Call()呢?还是通过找网络消息名字_handler,有C2R_Login则找C2R_LoginHandler,在Run(xxx)中,做了如下的事情
1-随机分配一个Gate
2-向gate请求一个key,客户端可以拿着这个key连接gate
3-将拿到的key写在回复的消息R2C_Login中
4-释放session

C2R_LoginHandler : MessageSessionHandler<C2R_Login, R2C_Login>,游戏客户端session与服务端的session是两个session。

MessageSessionHandler与MessageHandler如何区分使用?
跟消息是不是使用了ISessionRequest接口有关,如果使用了,则要使用MessageSessionHandler。

FiberInit_Realm文件中,有一个分发逻辑(类似虚函数),Invoke()类似与时间发布,但是不同的是,
1- Invoke类似函数,必须有被调用方,否则异常,调用者跟被调用者属于同一模块,比如MoveComponent中的Timer计时器,调用跟被调用的代码均属于移动模块
2- 既然Invoke跟函数一样,那么为什么不使用函数呢? 因为有时候不方便直接调用,比如Config加载,在客户端跟服务端加载方式不一样。比如TimerComponent需要根据Id分发
3- 注意,不要把Invoke当函数使用,这样会造成代码可读性降低,能用函数不要用Invoke
4- publish是事件,抛出去可以没人订阅,调用者跟被调用者属于两个模块,比如任务系统需要知道道具使用的信息,则订阅道具使用事件

在C2R_LoginHandler来判定账号与密码的合法性,然后获取数据库组件:
DBComponent dbComponent = session.Root().GetComponent().GetZoneDB(session.Zone);
在FiberInit_Realm中添加数据库管理组件
root.AddComponent();然后调用语句开始查询,访问其他属性的变量需要使用FriendOf(xxx )

在Config/StartZoneConfig中,配置的是有关区(zone)的信息,在session.Zone()取到的值也是这里填的区ID,配置中也有关于数据库的配置,一个区一个数据库,
在这里插入图片描述
使用协程锁避免同个账号的写入问题。
在这里插入图片描述
// 挂上这个组件,5秒就会删除session,所以客户端验证完成要删除这个组件。该组件的作用就是防止外挂一直连接不发消息也不进行权限验证
session.AddComponent();

PlayerComponent 用于管理player实体,
MailBoxComponent 增加后就拥有处理网络消息的能力,根据增加时候设定的参数,就能处理参数类型的网络消息,并不是所有的消息都能处理。

SessionPlayerComponent 与PlaySessionComponent 区别与关系,相互记录,完成一一映射的关系,可以通过Player找到session,也可以通过session找到Player:
session.GetComponent().Player.

session有过期的情况,所以经常会出现覆盖的情况。

EnterMapHelper里面有进入到另一个地图的步骤 1- 发送进入地图请求 2- 等待场景切换完成 3-发布进入地图的事件

处理进入地图的方法:C2G_EnterMapHandler,模拟地图传送的逻辑,先创建一个虚拟地图,登录后传送过去。
在这里插入图片描述
步骤:1-在player上加一个GateMapComponent,创建临时MapScene并赋值给GateMapComponent上的Scene上。2-从DB中加载数据,创建Unit映射对象实体到刚才创建的GateScene中 3- 传送到登录的场景中去。TransferHelper.TransferAtFrameFinish()。也就是说在player身上加了一个GateMapComponent组件,在该组件上创建了一个gateMap场景,然后在这个场景上添加Unit映射对象,然后传送过去。

传送会等待一帧在执行,在当前这帧,会回到EnterMapHelper中,等待场景切换完成(就是等待传送的这一帧执行完毕-使用objectWait类),

传送前需要锁定,Unit实体如果在传送的状态,无法就行其他的操纵。

传送函数的步骤(Transfer(xxx)):1-获取需要传送单元当前的场景 2-创建一个传送的消息并赋上对应的参数(位置id-ActoriId,对象序列化数据,以及它身上所有的实现了ITrandfer接口的组件的序列化数据).3-原单元对象释放,4-锁住改单元并且发送请求,锁住是为了避免在传送过程中再对对象进行操作。

ActorId是位置id,由进程id,场景id,实体id生成一个对应的id,

M2M_UnitTransferRequestHandler类是处理接收对象的类(M2M是mapToMap的意思),步骤如下:
1-重新创建Unit对象。从request中的数据反序列化一个对象,同时反序列化这个单元实现了ITransfer接口的组件,给这个unit添加移动与寻路组件,并设置它的初始位置,同时添加MailBoxComponent组件用来通讯,
2-在场景中获取一个单位组件(UnitComponent)并将反序列化的单元加载该组件上。
3-发送一个场景已经改变的网络消息M2C_StartSceneChange (M2C是MapToClient的意思)
4-加入AOI组件,用来处理多人同屏的相关逻辑。
5-通知Locaition定位服务器,解锁发送时的锁。

如果Unit没有附加在组件上进行管理,那么就会造成内存泄漏永远不能回收,

M2C_StartSceneChangeHandler处理场景切换消息。

M2C_CreateMyUnitHandler 刚才发送消息的处理类。

AfterUnitCreate_CreateUnitView中是创建View层Unit的相关逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是&#xff1a;支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…

安全实验作业

一 拓扑图 二 要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 4、所有设备均可访问R4的环回&#x…

响应式编程_02基本概念:背压机制 Backpressure

文章目录 Pre流流的处理模型拉模式推模式 流量控制产者生产数据的速率小于消费者的场景生产者生产数据的速率大于消费者消费数据无界队列有界丢弃队列有界阻塞队列 背压机制响应式流规范响应式流的核心接口PublisherSubscriberSubscription 响应式流的技术生态圈 小结 Pre 响应…

Android 进程间通信

什么是IPC&#xff1f; Android 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统&#xff0c;每个应用通常运行在自己的进程中&#xff0c;以提高安全性和…

Macos给brew安装的neo4j配置apoc插件

文章目录 打开并查看neo4j版本下载apoc插件安装apoc插件修改conf配置文件验证成果 打开并查看neo4j版本 open /usr/local/Cellar/neo4j下载apoc插件 apoc插件下载界面&#xff0c;选择与neo4j兼容的apoc版本apoc与neo4j版本对应表 安装apoc插件 将下载的apoc jar包&#…

回顾生化之父三上真司的游戏思想

1. 放养式野蛮成长路线&#xff0c;开创生存恐怖类型 三上进入capcom后&#xff0c;没有培训&#xff0c;没有师傅手把手的指导&#xff0c;而是每天摸索写策划书&#xff0c;老员工给出不行的评语后&#xff0c;扔掉旧的重写新的。 然后突然就成为游戏总监&#xff0c;进入开…

Go语言的转义字符

文章目录 1. Go语言的转义字符(escapechar)2. 小结和提示 1. Go语言的转义字符(escapechar) 说明:常用的转义字符有如下: \t : 表示一个制表符&#xff0c;通常使用它可以排版\n &#xff1a;换行符\\ &#xff1a;一个\\" &#xff1a;一个"\r &#xff1a;一个回…

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架&#xff0c;Django是一个高度模块化的框架&#xff0c;使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能…

《Kettle保姆级教学-核心概念解析》

目录 一、什么是ETL&#xff1f;1、ETL 的三个主要阶段2、ETL 的应用场景3、ETL 工具 二、什么是Kettle&#xff1f;1、Kettle 的核心功能2、Kettle 的主要组件3、Kettle 的优点4、Kettle 的应用场景 三、Kettle核心概念1. 转换&#xff08;Transformation&#xff09;2. 作业&…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

Linux设备树(DTS)入门学习

前言&#xff1a; Linux设备树(DTS)入门学习&#xff0c;资料搜集。从零开始入门学习Linux设备树 Device Tree (DTS)&#xff0c;建议的学习流程如下&#xff1a; 1. 讯为电子在哔站上的-Linux设备树视频教程&#xff08;嵌入式学习之Linux驱动&#xff08;第七期_设备树_全新…

用python实现进度条

前言 在Python中&#xff0c;可以使用多种方式实现进度条。以下是几种常见的进度条格式的实现方法&#xff1a; 1. 使用 tqdm 库 tqdm 是一个非常流行的库&#xff0c;可以轻松地在循环中显示进度条。 from tqdm import tqdm import time# 示例&#xff1a;简单的进度条 fo…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【蓝桥杯嵌入式】LED

1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”&#xff0c;led此时不会改变状态&#xff0c;所以可通过led对应的八个引脚的电平来控制led的状态&#xff0c;原理图分析…

苹果再度砍掉AR眼镜项目?AR真的是伪风口吗?

曾经&#xff0c;AR游戏一度异常火热&#xff0c;宝可梦go让多少人不惜翻墙都要去玩&#xff0c;但是也没过去几年&#xff0c;苹果被曝出再度砍掉了AR眼镜项目&#xff0c;面对着市场的变化&#xff0c;让人不禁想问AR真的是伪风口吗&#xff1f; 一、苹果再度砍掉AR眼镜项目&…

PostgreSQL 数据库备份与还原

为了安全与数据共享等&#xff0c;创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令&#xff1a;pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库&#xff0c;它支持多种备份格式&#xff08;SQL、自定义等&#xff09;&a…

排序算法--计数排序

唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数&#xff0c;直接计算元素在有序序列中的位置&#xff0c;要求数据是整数且范围有限。适用于数据为小范围整数&#xff08;如年龄、成绩&#xff09;&#xff0c;数据重复率较高时效率更优。可用于小…

C#结合html2canvas生成切割图片并导出到PDF

目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库&#xff0c;它可以把任意一个网页中的元素&#xff08;包括整个网页&#xff09;绘制到指定的 canvas 中&#xf…

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…

RK3566-移植5.10内核Ubuntu22.04

说明 记录了本人使用泰山派&#xff08;RK3566&#xff09;作为平台并且成功移植5.10.160版本kernel和ubuntu22.04&#xff0c;并且成功配置&连接网络的完整过程。 本文章所用ubuntu下载地址&#xff1a;ubuntu-cdimage-ubuntu-base-releases-22.04-release安装包下载_开源…