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的相关逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于HAI部署DeepSeekR1的招标文书智能辅助生产开发与应用

一、前言 1.1行业背景 在日常商业活动中&#xff0c;招投标流程往往是企业竞标和项目落地的关键一环。其中&#xff0c;招标文书的编写工作对于投标企业极具挑战&#xff1a;既要保证逻辑清晰、条理分明&#xff0c;又必须遵循招标机构的各类格式规范&#xff0c;甚至还有特定…

SQL/Panda映射关系

Pandas教程&#xff08;非常详细&#xff09;_pandas 教程-CSDN博客 SQL&#xff1a;使用SELECT col_1, col_2 FROM tab; Pandas&#xff1a;使用df[[col_1, col_2]]。 SQL&#xff1a;使用SELECT * FROM tab WHERE col_1 11 AND col_2 > 5; Pandas&#xff1a;使用df…

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…

w186格障碍诊断系统spring boot设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

ASP.NET Core JWT

目录 Session的缺点 JWT&#xff08;Json Web Token&#xff09; 优点&#xff1a; 登录流程 JWT的基本使用 生成JWT 解码JWT 用JwtSecurityTokenHandler对JWT解码 注意 Session的缺点 对于分布式集群环境&#xff0c;Session数据保存在服务器内存中就不合适了&#…

Axure大屏可视化动态交互设计:解锁数据魅力,引领决策新风尚

可视化组件/模板预览&#xff1a;Axure 一、大屏可视化技术概览 在数据驱动决策的时代&#xff0c;大屏可视化技术凭借直观、动态的展示方式&#xff0c;已成为众多行业提升管理效率和优化决策过程的关键工具。它能够将复杂的数据转化为易于理解的图形和动画&#xff0c;帮助…

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…

Android TabLayout 使用进阶(含源码)

android:layout_height“match_parent” android:orientation“vertical” tools:context“.mode2.ClassificationActivity”> <com.google.android.material.tabs.TabLayout android:id“id/tab_layout” android:layout_width“match_parent” android:layout_he…

【算法应用】Alpha进化算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 Alpha进化&#xff1a;一种具有进化路径自适应和矩阵生成的高效进化算法 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#…

机器学习--1.KNN机器学习入门

1、机器学习概述 1.1、什么是机器学习 机器学习&#xff08;Machine Learning&#xff09;是人工智能&#xff08;Artificial Intelligence&#xff09;领域的一个子集&#xff0c;它主要关注如何让计算机系统通过经验学习&#xff08;数据&#xff09;并自动改进性能。机器学…

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题 零、起因 最近在使用Ubuntu虚拟机编译ARM程序&#xff0c;解压ARM的GCC后想要启动&#xff0c;报“没有那个文件或目录”&#xff0c;但是文件确实存在&#xff0c;环境配置也检查过了没问题&#xff0c;本文记…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35&#xff0c;升级后发生的报错 一、 解决方案: 升级 gradle 和 gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip htt…

HTML 复习

文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…

用NeuralProphet预测股价:AI金融新利器(附源码)

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;我用NeuralProphet模型预测了股票价格&#xff0c;发现其通过结合时间序列分析和神经网络算法&#xff0c;确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…