gate是goworld里面功能最简单的进程,先从gate看起。回顾下goworld的架构(如下图),gate是连接客户端和分发器的进程,它会开启网络服务,等待客户端连接,同时去连接dispatcher,转发这两者的消息。

系列文章

gate的启动流程

以下代码展示了gate的启动流程,大体是读取配置、设置信号等一些很常规的操作。gate的核心在于gateService,所有功能都隐含在一句gateservice.run之下。另外dispatchCluster处理了分发器的连接,由game去连接分发器。

如下图的代码,GateService会开启TCP服务,等待客户端的连接。

gate启动后进入个循环,它实质上就是处理来自客户端的消息和来自dispatch的消息,以及处理定时器的消息。

Gate需要保存客户端的哪些信息

当客户端连接后,服务端会新建ClientProxy,即客户端代理,用它来存储客户端所需的信息,只有知道这些信息才能够将实体与连接关联。如下的结构中,最重要的信息是代表连接的GoWorldConnect和代表控制实体的clientid。

新客户端连接过程

下面我们分析客户端连接进来的全过程,当客户端连接时gate会创建一个clientProxy(如下代码)

创建完成后会选一个dispatcher发送新客户端连接的信息。(如下代码)

发送的数据包括消息类型MT_MOTIFY_CLIENT_CONNECTED,以及实体ID(gate生成的一个唯一ID,如下代码所示)

再看到Dispater,它在收到gate的消息后,会随机选取一个game,发送有客户端登录的消息。

再看到game,当它收到dispatch关于客户端连接的消息后,game就会创建一个BootEntity,也就是Account。这里面代码的MakeGameClient以及赋值的内容其实只是让entity记录和它关联的客户端连在哪个game上。

为什么BootEntity是Account?这是在goworld.ini中设置的,如下图所示。

整个连接的过程如下图。


推荐些资料

笔者所著《Unity3D网络游戏实战(第2版)》是一本专门介绍如何开发多人网络游戏的实战书籍,手把手教你搭建网络框架,制作大型项目。

「同步」也是网络游戏开发的核心课题。玩家的位置和旋转需要同步给其他玩家,然而网络条件差,会不同步和卡顿。笔者主讲的live《网络游戏同步算法》揭示做好同步的方法,欢迎收听。