因为我所在的游戏的区组还是不少,有些是很老很老的区了,所以到现在人数太少的区组就会进行合并。但有时我们也需要不合并区组也能让不同玩家到一起游戏。策划活动的需求主要有两种,第一个是两个区之间的跨服战,那么我们通过将两个区的数据拉同一台服务器上,然后按照并组方式处理。第二种是有些指定玩家到同一服务器上参加活动,那也是要专门先把玩家数据导出,然后放到该活动服务器上。这样的处理方式主要带来两个问题,一是对于服务器数据管理人员的操作负担比较大;二是对于玩家而言,他参加该活动是要重新登录到一个指定的活动服务器上,游戏中间有较强的跳出的感觉。
当初和老大讨论,就希望做一个在游戏内部玩家通过与NPC交互,判断条件满足的玩家就可以直接进入活动服务器,感觉就跟跳了个地图一样。由于这个东西不是版本的开发需求,只是程序端的一个预研方案,所以一直是在版本开发中断断续续在进行,前面折腾了一个月把基本功能实现,中间停掉开发一个大版本,闲下后又折腾了快一个月,把重名等各种细节问题处理掉,现在基本上算是完成了,再准备到测试服上进行测试。
先介绍下游戏的基本结构,玩家登陆游戏后,客户端通过GameGate和GameServer连接,GameServer依赖与DBServer处理玩家的持久数据。不同区组的DBServer只和中央服务器连接。GameServer是按内容分的多GS模型,不同地图可能在不同的GS上。
要完成玩家的内部跨区功能,主要处理两个问题,一是要将本地的玩家数据发送到远端服务器上。二是要玩家客户端连接到远端服务器上。
基于现有的游戏结构,就是通过中央服务器来中转玩家数据,DB之间是不可以直接通信的,实在不安全。而数据传输到目标DB后,让客户端重新连接到目标区组的GameGate上,然后进入跨GS的流程,即完成玩家跳转。
主要流程就先看看图的,一图胜千言嘛。

整个流程中主要通过三次远程协议交互来完成跨区功能。第一次握手是确认目标区组可达,并确认跨区玩家按照何种方式跨区,是否携带玩家数据(玩家从活动服务器上回来时,是不带数据的)。第二次握手是用于传输玩家数据(所有玩家相关数据都一次发送,由于数据量可能比较大,所以必须压缩。即使不需要传输数据,也按照该流程走)。第三次握手就是在远端服务器上注册玩家信息,并添加一个跨区session到远端DB,并返回远端Gamegate的ip和port。然后客户端重连GameGate,进入跳GS流程(其实也就是一个登录流程的简化版),然后玩家进入到新区。
主体流程想清楚后,其实并不复杂,回头重新回顾下实现中遇到的种种细节问题。
本文总结了在游戏环境中实现跨区功能的实践经验,包括跨服战和指定玩家活动的处理方式,以及由此带来的服务器管理和玩家体验问题。通过与NPC交互实现无缝进入活动服务器,避免了数据管理人员的操作负担和玩家的登录中断感。文章详细阐述了游戏结构,关键在于通过中央服务器中转玩家数据,以及三次远程协议交互完成跨区功能。整个流程涉及玩家数据传输、远端服务器注册和客户端重连等步骤。
&spm=1001.2101.3001.5002&articleId=5814213&d=1&t=3&u=5eace0944c3746869c20e813714555b5)
1333

被折叠的 条评论
为什么被折叠?



