0
点赞
收藏
分享

微信扫一扫

游戏思考04:网络游戏同步算法的理解(参考网易雷火jerish的文章,未完待续2/9)

文章目录

一、网络同步概念理解

  • 举例:
    比如说用户A用他的手机点击按钮注册了一个QQ账号,那么他的手机号等个人信息就会被存储到服务器上面,这就是一个数据同步的过程。在这个过程中,数据由A的手机流向了QQ的官方服务器。对于游戏来说,其实原理也是一样,不过由于游戏中玩家关注的是游戏的视觉效果,所以我们不仅要同步数据,还要同步表现。可以简单认为,网络同步 = 数据同步+表现同步,数据同步是后端操作,而表现同步就是让前端对后端同步过来的数据进行进一步的处理从而达到表现上的一致。

在这里插入图片描述
不过一般Web服务器只是单纯的从服务器向客户端进行数据同步,不会把其他客户端的数据都发给你。而在游戏里面,你需要让N个客户端的显示看起来一模一样(由于网络延迟,同一时刻不可能完全一样),所以需要把其他玩家的一些数据也发给你,不能说A玩家跳了一下,B玩家看到A却趴下了,那样游戏就没法玩了。

高及时性
然而,前面我们还忽略了一个游戏中非常重要的需求(尤其是在MMO、FPS这种类型的网游中)——那就是实时性。你可以容忍微信点进去一个文章要花2秒钟,但是你不可能接受你的子弹要2秒后才打到敌人。实际上,在各种电子竞技里面,0.1秒的延迟就足以让整个游戏的局势发生逆转。像浏览器这种页面显示都吞吞吐吐的应用,如何用他流畅的玩FPS和MOBA呢?(关于云游戏这里先不谈)。可以认为 网络同步 = 实时的多端数据同步+实时的多端表现同步

二、网络架构与传统同步

1)网络游戏架构的发展

  • P2P架构:Packet Server

以某个客户端为Host主机(或叫做ListenServer)的CS架构),这样的架构不需要单独都维护一个服务器,任何一个客户端都可以是Sever,能够比较方便的支持局域网内对战,也能节省服务器的运行与开发成本。不过,虽说也是CS架构,如果Host主机不做任何server端的校验逻辑,那么其本质上还是P2P模型,只不过所有的客户端可以把消息统一发送到一个IP,Host再进行转发,这种方式我们称其为Packet Server。
在这里插入图片描述

  • 主流架构
    后来一些游戏团队(比如id software)又对CS架构做了进一步调整,先是将大部分的逻辑处理移到服务器上(服务器可能是一个独立的无窗口的后台程序),客户端只负责渲染。随后为了对抗网络延迟提升客户端的流畅性,又把一部分逻辑交回给客户端本地预执行,最终成为很多经典游戏和引擎的架构方式
    在这里插入图片描述
  • 多点服务器(镜像服务器模型)
    这种模型提供了多个服务器的拷贝,避免单点崩溃影响到所有玩家的问题。类似CDN,玩家还可以选择就近的服务器进行通信,降低了通信延迟。不过,这种方式增加了服务器的租用和维护成本,在后续的游戏网络架构中并没有被大量使用,倒是WEB服务器广泛采用这种模型并不断将其发扬光大。

在这里插入图片描述

  • 按照业务逻辑区分单独的服务器
    再后来,游戏服务器架构不断发展。游戏存储负载和网络连接负载随后从逻辑服上拆分出来,形成独立的服务;玩家数量增多后,又将游戏拆分成多个平行世界,出现了分服和跨服;游戏逻辑进一步复杂后,又开始按照功能去划分成网关服务器、场景服务器、非场景服务器等。我们今天讨论的网络同步几乎都是在逻辑服务器(基本上无法拆分)上进行的,所以后续的这些架构方式与网络同步的关系并不是很大,这里就不再赘述

在这里插入图片描述

2)传统同步面临的问题

  • 停等协议
    网络游戏刚出现的时候,大部分还属于弱交互游戏,可以将其简单理解为一种回合制游戏。这种游戏采用的同步方式与计算机网络中的停等协议(stop-and-wait-type)非常相似,是一种很自然也很简单的同步模型。不过由于当时网络同步并没有形成体系,所以这种同步方式也没有名字。在局域网盛行以及玩家数量较少的条件下,这种同步方式与架构都是可行的。

不过随着游戏的种类和玩法复杂性的提升,面对的问题也接踵而来。

1)在CS架构下逻辑在客户端执行还是在服务器执行?如果逻辑都在服务器执行,那么客户端的操作都会被发送到服务器运算,服务器计算出结果后通知客户端,客户端拿到结果后再做表现,这样的好处是所有的逻辑由服务器处理和验证,客户端无法作弊,但坏处是会造成客户端的资源被浪费,服务器运算压力过大。如果逻辑在各个客户端执行,那么玩家可以在本地计算后再把本地得到的结果告知服务器,服务器只进行简单的转发,这样的好处是玩家的本地表现很流畅,但坏处是很容易在本地进行作弊。而对于P2P架构,反作弊更是一个严重的问题,我连一个权威服务器都没有,根本无法验证其他客户端消息的真伪,怎么知道其他玩家有没有作弊?

2)我们要发送什么数据来进行同步?如果发送每个对象当前的状态,那么如果一个游戏里面有大量的角色,就会大规模的占用网络带宽,造成数据拥塞、丢包等等问题。如果发送玩家指令,那这个指令是要服务器执行还是服务器转发?而且对于大型多人在线游戏又没必要处理所有不相关的玩家信息,同样浪费网络资源

3)面对日益成熟的计算机网络协议,我们选择哪种来进行同步?TCP、UDP还是Http?

(这时,游戏开发者们需要面对“发什么数据”,“在哪计算”,“发给谁”等细节问题,他们开始考虑引入更多的其他相关领域的技术(比如计算机模拟仿真)来解决游戏中的同步问题,网络同步概念初见端倪)

未完待续

举报

相关推荐

0 条评论