UE3客户端加入DS过程
拉起DS进程
客户端将比赛地图及相关参数发送给ZoneSvr请求开赛,收到消息后,ZoneSvr会分配一个ip和端口号,并与客户端发过来的地图及其他参数,来构建一个命令行来拉起一个DS进程,
DS启动时在UGameEngine::Init ==> UGameEngine::Browse中调用UGameEngine::LoadMap来序列化地图数据到UWorld* GWorld,
并调用UWorld::SetGameInfo来创建AGameInfo对象,然后调用UWorld::Listen来创建UNetDriver* NetDriver,并调用UTcpNetDriver::InitListen来创建socket,
在LoadMap结尾发送一个信号量通知ZoneSvr,要ZoneSvr将ip和端口号发送给客户端,告诉客户端自己已经准备好了
最后DS在UWorld::Tick中每帧调用NetDriver的UTcpNetDriver::TickDispatch函数中检查是否有客户端连接过来
客户端加入DS
客户端得到DS的ip和端口后,执行命令:open 10.123.102.132:7500?Uin=5897623?Name=Tom?Team=0?ClanName=?SpectatorOnly=0?bVIP=0?bIsRoomOwner=0
open命令会调用UGameEngine::SetClientTravel函数将open命令参数内容设置给UGameEngine的TravelURL变量
客户端在游戏主循环UGameEngine::Tick中会每帧检查UGameEngine的TravelURL变量是否为空
当不为空时,会调用UGameEngine::Browse来创建UNetPendingLevel类型的全局指针变量GPendingLevel
GPendingLevel在其构造函数中创建UTcpNetDriver对象,然后调用该对象的InitConnect函数来创建UDP的Socket、UTcpipConnection对象及Control Channel
然后客户端就正式开启了加入DS的过程,详细如下图所示
Step2补充说明:
Ds在UWorld::Tick中每帧调用NetDriver的UTcpNetDriver::TickDispatch函数会先在ClientConnections数组中查找是否已经创建了这个客户端的连接,
发现没有会调用UTcpipConnection::InitConnection来创建一个新的NetConnection,然后加入到ClientConnections数组中,
然后使用这个新的NetConnection调用ReceivedRawPacket来处理网络包数据,由于NMT_Hello包使用的是ControlChanel发送的,
而当前NetConnection的Channels数组中没有该Chanel,于是会调用UNetConnection::CreateChannel创建ControlChanel,
然后使用新的ControlChanel调用UChannel::ReceivedRawBunch ==> UChannel::ReceivedSequencedBunch ==> UControlChannel::ReceivedBunch ==> UWorld::NotifyControlMessage来做出应答
Step5补充说明:
bSuccessfullyConnected为true,并有了URL.Map及游戏模式,使得UGameEngine::Tick中检查通过开始LoadMap加载客户端地图:
① 加载失败,则调用传入?failed参数调用UGameEngine::Browse来关闭UNetPendingLevel连接并将GPendingLevel置NULL(在UGameEngine::CancelPending函数中实现),然后加载缺省地图(如大厅地图)
② 加载成功,在LoadMap函数中会将GPendingLevel的NetDriver、NetConnection、ControlChannel转交给新地图的GWorld,地图加载完成后会发送NMT_JOIN消息,并将GPendingLevel置NULL
其他说明:
a. UE3通过FSocketSubsystem类型封装了windows(FSocketSubsystemWindows)和unix(FSocketSubsystemBSD)上的Socket,向上对引擎提供了一致的编程接口
引擎通过提供全局变量FSocketSubsystem* GSocketSubsystem单例的方式来使用Socket相关功能
b. 服务器的收包逻辑在UWorld::NotifyControlMessage函数的else分支中,客户端的收包逻辑在UNetPendingLevel::NotifyControlMessage函数中
UE3客户端加入DS过程的更多相关文章
- SpringMVC处理客户端请求的过程
SpringMVC处理客户端请求的过程 以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发. 1.客户端发起一个访问网站的请求(如: localhost:8080/index). ...
- NIO客户端主要创建过程
NIO客户端主要创建过程: 步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下: SocketChannel client ...
- UE3客户端服务器GamePlay框架
客户端(当前玩家)与服务器对应关系图: 整体上看,UE3的GamePlay框架使用的是MVC架构 ① 橙色的Actor对象及橙色箭头相连的成员变量只会被同步给Owner客户端 Controller:控 ...
- 记一次kafka客户端NOT_COORDINATOR_FOR_GROUP处理过程
转发请注明原创地址:https://www.cnblogs.com/dongxiao-yang/p/10602799.html 某日晚高峰忽然集群某个大流量业务收到lag报警,查看客户端日志发现reb ...
- Fabric1.4源码解析:客户端创建通道过程
在使用Fabric创建通道的时候,通常我们执行一条命令完成,这篇文章就解析一下执行这条命令后Fabric源码中执行的流程. peer channel create -o orderer.example ...
- 利用IDEA创建Web Service服务端和客户端的详细过程
创建服务端 一.file–>new–>project 二.点击next后输入服务端名,点击finish,生成目录如下 三.在 HelloWorld.Java 文件中右击,选 WebServ ...
- 安装oracle 11g 客户端,检查过程中报物理内存不足的解决
今早接到同事电话,说安装oracle 11g客户端的时候,在检查先决条件的时候,报错,说内存不足,但是本机的内存是2G,肯定够用:如图: 找了一圈,原来Oracle执行先决条件检查是依赖c$共享,很多 ...
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...
- Netty源码分析之客户端启动过程
一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...
随机推荐
- [Swift]LeetCode212. 单词搜索 II | Word Search II
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...
- Java面试题:小白不得不懂的斐波那契数列
很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博 ...
- .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
- 【从零开始自制CPU之学习篇01】识别四色环电阻
制作CPU的好多部分都用到了各种阻值的电阻,由于我选购的是色环电阻,即电阻表面涂上一定颜色的色环,来代表这个电阻的阻值.因此通过色环来快速识别电阻阻值需要作为储备知识,不然一堆电阻插在面包板上很快就乱 ...
- 『宝藏 状态压缩DP NOIP2017』
宝藏(NOIP2017) Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决 ...
- Kibana安全特性之权限控制
1. 前言 在之前的例子中,我们都是直接输入地址访问的,系统也没有提示我们要输入用户名密码.但是,在实际使用过程中不大可能所有人都是超级管理员可以做任何操作,一定是有权限控制的,这里我们借助X-Pa ...
- 解决vs-code高cpu占用率问题
(microsoft.vscode.cpp.extension.darwin进程高cpu占用问题) 免费的vs-code现在已经成为mac/linux平台的码农新宠,毕竟从windows平台开发vir ...
- ELK-log4j2异步输出+logstash
1.pom.xml配置文件 <dependency> <groupId>log4j</groupId> <artifactId>log4j</ar ...
- Cglib动态代理浅析
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-06-29/18.html 作者:夜月归途 出处:http://www.guitu ...