上篇文章《游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案》,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以点击链接回溯之前的内容。本期内容,将会重点介绍对战类全球服游戏的设计思路与技术实现。
<强>对战类游戏的设计思路强>
<强>协议的选择强>
游戏设计之初,需要决定选择哪种协议来进行通讯。对于对战类游戏来说,首先推荐的肯定是UDP。
尽管UDP对开发基础有较高的要求,需要开发者自己实现传输成功检验,重传以及可靠性保证等,但相对于低开发成本的TCP、UDP在效率和时效性上都有极大的优势,它可以根据业务特性进行短间隔重传,或者直接发送复数包来提高弱联网状态的成功率。
此外,相比于UDP的低延时,TCP的重传时间是秒级,对于对战类游戏来说,TCP的重传速度无疑会造成非常糟糕的玩家体验,虽然有BBR一类的技术,但也仅仅只能实现更高效的带宽利用,对于实际业务响应效率没有特别大的提升。
当然,除了技术角度分析,公司的实际情况也是需要纳入考虑的重要的一环。总体来说,COC,洋槐(阿瓦隆之王)等地图类少交互的游戏用TCP是没有问题的,而CR(皇室战争),自由之战,全民枪战,枪林弹雨,这类MOBA, FPS等强联网需求的对战游戏,UDP基本是必备的。
<强>同步机制强>
帧同步:快节奏,同时希望降低服务器不必要负载的对战类手游,帧同步是不二的选择。帧同步的好处是可以精减上传信息,只是做一些简单的数据汇总上报,需要的带宽非常少。
状态同步:安全性很高,但状态同步需要的带宽量远大于帧同步,而全球服游戏本身面临着非常严峻的全球网络环境,甚至很多情况下需要专线来解决网络问题,这时候,网络开销将是比较大的成本。
简而言之,一句话:如果你想做全球服游戏,请务必学会帧同步。
最后,简单说一下对战游戏的几点特性:1)因为采用UDP和帧同步,数据包交互包量巨大;2)玩家快照和帧数据保存需要高性能大容量的内存存储;3)网络稳定要求高;4)架构主要以模块化为主,有的甚至可以两地三中心容灾,需要敏捷部署。
总体来说,对战类游戏对系统架构有较高的要求,而云平台产品,正是为帮助用户解决这些问题而存在的。
<>强网络架构设计强>
那么,我们是如何为对战类强联网用户提供网络支撑的呢?首先,在网络质量方面,我们采用自建的边界网关协议及自有号,直接和电信联通移动等运营商进行路由对接。相比于找中间商,这种方式在网络的覆盖质量,故障容灾能力以及高可用上,都有更好的保障。
此外,我们将机房和网络进行了分离,网络出口各自独立,通过不同的物理路径走到不同的出口流行点,这里的流行点就是UCloud自建边界网关协议和运营商建立连接的地方,最底层是可用区,也就是传统意义上的机房。当用户在UCloud平台部署的时候,就是利用了可用区的架构。
这种方式可以将所有的机房资源池化并通过专线打通内网,为用户免费提供相同地区不同机房间的网络互通,方便用户实现跨机房高可用的容灾架构,同时多流行点也可以规避物理路径问题或者运营商本地城域网故障(比如北京本地)带来的影响,保证机房出口的持续高可用。
<>强基于UCloud云平台的游戏架构示例强>
下图是一个基于UCloud云平台的全球服游戏架构,首先,数据存储层直接使用了高可用数据库和复述,来降低运维成本,并保证业务可用性;后端在原生产品的逻辑上,对诸如半同步等功能进行了自研强化,在不改变任何用户使用习惯的情况下,强化数据一致性、安全性,以及查询性能。
此外,服务器区域采用整体框架集群+高性能负载均衡的接入模式,TCP四层报文转发,保证大并发下的性能可靠,而对战服务器采用了注册机制,房间管理服务器为主从高可用,由于对战采用了UDP +帧同步的模式,包量可能会达到5 w-8w甚至更多,因此直接采用了网络增强云主机来承载。