这个曾经在端游时代主导搭建 RTS 游戏《霸三国》框架的技术团队,在转型做 MOBA 手游《王者荣耀》后为游戏提供了巨大的支持,但这个过程也并非一帆风顺。
在今年刚结束的腾讯 TGDC 上,《王者荣耀》技术总监孙勋在技术专场中,对这款游戏进行了一次技术复盘,从技术层面上为听众嘉宾讲解了游戏在引擎、整体网络架构与网络同步方案上的尝试与转变。
孙勋称,目前游戏的服务器架构主要由“游戏大厅”和“PvP”2 个部分组成,而在不断探索中,后来又在架构中加入了 Proxy 中转服务器,也正是这个服务器的加入为《王者荣耀》解决了后来“安卓、iOS”同服等一系列出现的问题。
此外,他还介绍了《王者荣耀》在网络协议以及同步方案上的一些尝试,并一一复盘了这些尝试的优劣势。
为大家解答了为什么,最终游戏会放弃 TCP 协议(传输控制协议)与曾经在《霸三国》中所使用的 Client-Server 结构(C/S结构),并且转而使用了 UDP 协议(用户数据报协议)与帧同步方案。
本文是腾讯王者荣耀项目技术总监孙勋带来的《王者荣耀技术架构》主题演讲内容整理。将分几部分为大家介绍王者后台开发过程中的一些内容和思考:包括《王者荣耀》整个背景介绍、后端架构、上线后的调整,以及网络同步方案和反作弊方案等。
现在《王者荣耀》后端机器大概有 4600 多台,我们的容量也有一定的扩展,进程数目是 4 万多个。
《王者荣耀》游戏背景
2012 年,我们当时做的端游《霸三国OL》,就是王者的前身。这款产品最开始是偏向 RTS 的游戏,后来我们把它改成了端游 MOBA,再后来做成了手游 MOBA,即现在的《王者荣耀》。
从 2012 年开始做 RTS 游戏到 2013 年,从多控制单位的 RTS 游戏,变成 MOBA 游戏,到 2014 年启动手游 MOBA 的预研,再到 2015 年 2 月份我们把大量人力(大概 100 多号人)投入做《英雄战迹》(《王者荣耀》前身)开发,时间并不长。
《霸三国》的玩法是玩家可以在战前通过排兵布阵构成自己局内的策略,通过控制多个单位,技能释放、兵种特性的释放形成对抗。
我们最开始做《霸三国》的时候客户端引擎是 unreal,但在做《王者荣耀》的时候改用了unity 引擎,3 到 4 个月的研发时间内,产品本身从代码层面没有任何东西是从《霸三国》那里搬过来用的,全部代码都需要重写。
《霸三国OL》的一些启示
做端游《霸三国OL》的这段经历,给我们做王者带来很多相应的启示,比如策划、程序及整个团队对 MOBA 的理解。
另外当时在做端游《霸三国》的时候,我们采用了 Client-Server 的模式,但其实在过程中有借鉴类似帧同步的概念:例如在断线重回对视野的处理这块。
传统的做法是,重回时会发当前的镜像和后续的其他下行通知信息。
这种做法会有一个问题,如果新增其他的场景内模块的时候,根据场景内包含的当前的各种物件、所在状态的各种各样信息,都需要把这些东西打包发下去,在后续开发、维护的时候会显得很麻烦。
我们的做法是,把服务器下发的所有序列包做缓存,并按顺序重发,让客户端做出快进的表现,它的概念和帧同步比较类似。
还有一点,就是预留设计弹性,在最开始的 RTS 中,每个玩家最多可以操作 5-8 个单位进行对抗,到后来改成 MOBA 游戏,只能操作一个英雄,并且加入各种各样的场景,我们本身的技术框架并不需要做出颠覆性的改动。
《王者荣耀》整体架构
目前《王者荣耀》后台的整体架构设计是源自产品的需求。如果大家玩过《王者荣耀》就会知道,PvP 对抗是不分区服的。
微信 1 区的玩家可以和微信 2 区玩家一起对抗,甚至 iOS 平台也可以和 Android 平台的人一起玩,但同时一些共有地方也保留了分区概念,比如战队、排行榜是基于“区”概念的。“区”在游戏里面就是编号,可以理解为打在玩家新建角色上的 Logo。
我们最开始做架构实现的时候,服务器当时做得比较简单,从原型开始只是保留了大厅和 PvP 服务器这两块,两者是分开的。
PvP 服务器使用类似 CGI 调用,可以分配资源的使用,用完之后再回收,不负责其他的东西。需要的东西从大厅拿,用了之后回给大厅,让大厅回写 DB。
我们在大厅和 PvP 之间做直联,后来把直联改成了中间转发,在《王者荣耀》里面我们叫 Proxy,相当于代理服务器,以屏蔽本身后端很多进程分布的细节。因为游戏本身的机器、进程很多,还有不同的路由规则。
某些排行榜或者战队是根据逻辑区的编号来确定哪台机器,或者多台机器进行处理的。有些消息采用随机转发或者多发广播的方式,这些都是由 Proxy 负责路由。之后又加入了房间服务器,它负责的是《王者荣耀》内匹配、排位等相关功能。
怎么样把实力比较接近的人糅合到一块儿玩,是由房间匹配服务器来做相应的负责的,因此会有战队和其他服务器战队匹配到一起。
最后我们在上面加入了一个 Adapter,作用是用本身已经部署的大区资源实现跨服匹配的功能。
游戏的后端架构,除了战队这样的服务器之外,所有其他的模块都可以在线扩容,或者在发现有引起在线下降的故障时,从整个架构里自动屏蔽掉。
因为路由方式会限定比如一区、二区、三区到这台机器处理,如果故障,影响的只是某几个逻辑区玩家请求的处理,降低故障影响范围。
《王者荣耀》目前的机器数量,可能每周都会发现有机器坏掉,至少有一台机器宕掉,在架构里面保证模块自动屏蔽,和在线扩容,是非常重要的事情。
文章评论 本文章有个评论