本文节选自《2018腾讯移动游戏技术评审标准与实践案例》手册,由腾讯互娱高级工程师周长寿分享《天天酷跑》手游如何做同步机制的设计,解决网络延迟、渲染延迟等问题,以提高玩家实时PK的体验。

伴随着手游浪潮,实时PK已成为很多游戏的标配。但由于网络延迟的存在,玩家本地状态、在服务器的状态和在其他玩家机器上的状态,三者不可能一致。同步问题本质上是一致性问题,游戏中不同玩家看到的状态需要是一致的。假如游戏中A、B两个玩家移动,并同时向对方发出射击的指令。如果没有合适的同步机制,那么可能出现的情况有:A屏幕显示B已经被杀死,B屏幕显示A已经被杀死。因此需要有同步机制来解决由于网络延迟和渲染延迟等造成的玩家状态不一致问题,给玩家更好的游戏体验。同步机制有许多种,根据游戏类型、技术条件甚至时代背景的不同,选择的同步机制也会不同。同步机制的选择,还可能涉及服务器架构的调整。

网络游戏同步,常用的两种方案是帧同步和状态同步。

帧同步是同步玩家的指令,服务器负责转发客户端的操作,每个客户端以固定的逻辑帧执行所有客户端的操作指令,通过在严格一致的时间轴上执行同样的命令序列获得同样的结果。

状态同步跟帧同步的最大区别是服务器不在进行切逻辑帧,而是同步玩家状态信息,比如位置、属性、跟玩法相关的数据。通常主逻辑在服务器运行,客户端只是作为一个显示。采用状态同步的游戏有CFM、LOL等。

帧同步的网络流量较小,但防外挂、断线重连的难度比较大。状态同步中服务器有所有玩家的状态,安全性较高,游戏运营更可控。是否选择状态同步,需要看同步的实体数量。在大场景中,同步的单位比较多时,往往会放弃状态同步。比如星际争霸中玩家可操作的实体多达上百个,如采用状态同步的话网络流量将非常大。

《天天酷跑》(以下简称“酷跑”)是一款横版跑酷游戏,先后推出了多种PVP玩法,包括世界对战、多人战、团队赛等等。下面介绍游戏几种典型PVP玩法在服务器端的同步方案和对应的架构调整。

一、世界对战

为了增加玩家之间的互动,酷跑上线3个月后,规划了世界对战的玩法。具体玩法是:参与游戏的玩家两两匹配进行对战,最后根据比赛分数、距离等决定胜负。

酷跑作为一个全民游戏,必须考虑玩家的网络状况。下图是酷跑世界对战推出时移动游戏接入网络的统计。2G/3G网络比例很高,网络质量不稳定,且都是按照流量收费。游戏过程中大规模的数据同步在当时还是不适合的。同时早期移动游戏的人力投入都比较小,版本迭代节奏也很快。

因此世界对战玩法提出时,酷跑选择了简单的同步方案——通过TCaplus数据库(腾讯自研NOSQL数据库)来实现玩家之间的数据同步。世界对战属于异步PVP,为了节省流量,玩家在游戏过程中没有交互,只在重要节点同步。包括匹配成功、开局、结算、领奖,同步数据量小、协议交互频率低。同时TCaplus数据库具有很高的读写性能,并且有专业的运维团队维护,使得开发团队的工作量相对较小,又能满足世界对战的同步需求。

服务器设计了TCaplus数据库表TB_PVPMATCH,用于记录玩家世界对战数据。每次参加世界对战会在TB_PVPMATCH表中增加一条记录,记录中定义了一个status字段,用于记录玩家找到对手、确认对手、付入场费、上报分数、领奖状态的变迁。

玩家匹配成功后会新增一条记录到TB_PVPMATCH表中,status状态标记为初始化。匹配成功后,客户端会固定每秒1次的频率发送对战状态协议到服务器,直到双方都扣入场费后开局。服务器收到拉取对战状态协议后,二手手机购买从TCaplus中获取TB_PVPMATCH表对应自己和对手的记录,根据双方的状态更新自己的记录并写入TCaplus和发送客户端。当客户端拉取的响应消息中标记入场费已扣除则开局,开始游戏。

游戏结束后,再次通过对战状态协议通知游戏已结束,服务器获取本局游戏数据并更新到TB_PVPMATCH表对应的记录中。如果对方已结束游戏,则可以直接结算。如果对方还在游戏中,玩家可以选择在结算界面等待对方或直接退出,下次再查看比赛结果。在结算的时候,或拉取对战双方在TB_PVPMATCH表中的记录,根据双方数据来判定胜负。

世界对战上线时,服务器架构比较简单。全局服务只有匹配服务,涉及的异步流程很少,其它逻辑在Gamesvr上处理即可。

二、多人战

2014年底酷跑推出了实时同屏多人对战模式的玩法。玩家要努力战胜对手,将速度最大化,用最短的时间跑完全程。多人战分经典战和道具战两种,经典战比拼速度,道具战通过道具增加或减少各种效果,玩家可以利用各种功能各异的道具保护自己,干扰对手。

多人战属于同步PVP,4个玩家匹配到一起后即可开局。由于对战中玩家数不多,同时服务器需要做一些逻辑,这里选用了状态同步的同步方案。游戏过程中玩家上报自己的操作、位置和状态给服务器,服务器做一些逻辑处理,再把该玩家上报的包广播给其他玩家,其他玩家收到包后,知道该玩家的状态,做相应的逻辑。游戏过程中,根据游戏场景,动态调节同步频率,达到节省同步包量,降低服务器负载的目的。玩家在游戏中平均每秒1次左右的同步。

版本灰度上线过程中,发现多人战服务所在机器的通讯进程进程TBus CPU占用很高。多人战服务是用来创建房间、同步包转发、对战结算的服务。需要与所有gamesvr和TConnd建立通道,单机Tbus通道达到上千个。

TBusd占CPU高,但网络流量又不大。最后发现Tbus通道达到一定数目,性能会急剧下降。Tbusd需要轮询所有通道进行收发包,通道过多时导致大量CPU空转。考虑到后续全局服务会越来越多,通道数会进一步膨胀,Tbus占用的内存、CPU会进一步上升。需要降低通道数,引入中转服务,可以使通道数收敛,同时前后端关系也解耦。

因此对架构进行了调整,逻辑层由2层变成3层,中间加了一个转发层,gamesvr与全局服务,全局服务之间不再直接通信,而是通过转发层中转,这样Tbus通道数得到了收敛,服务器之间的通信关系由网状变成了树状。

三、团队战

2017年初,为了加强玩家间的互动,设计了局内交互更频繁的团队战模式,强化玩家间配合,增加玩家对游戏的粘性。团队战是3V3对战,在比赛结束时,计算队友获得的总分,得到总分较高的团队获胜。玩家在挑战时,队友之间相互有联系。比赛中每过一段时间玩家就会进入到一个小游戏,如在极速前进中需要配合完成吃金币和空心银币的任务、在进击模式中需共同完成砍怪、在天空之城中队友之间分配合理的飞行线路可以获得较高的分数、队友通过巅峰挑战会落下高分流星雨作用于团队所有的队员等。

这是一个强交互的需求,队友间需要共享妖怪总血量、关卡中出现的金币等,给妖怪最后一击的只能是一个玩家、所有队友吃到的金币总和不能超过金币总量等。最初要求每秒15帧的数据同步,同时服务器需要做逻辑,因此团队战选择了状态同步的方案。服务器采取了简单的处理原则,先来先处理,处理时加上校验即可。同时针对不同关卡,动态调整同步频率。

团队战需要有团战服务来同步玩家数据,原有架构上下行包需要在客户端、Gamesvr和团战服务之间流转,团队战中高频的同步请求包对流量和CPU都会带来挑战。因此对架构进行了调整,将同步包独立出来,游戏过程中客户端直接与团战服务通讯。

这是目前的游戏架构,增加了客户端与团战服务直接通讯的能力。3v3匹配成功后,通知团战服务建立房间,同时下发客户端房间所在团战服务的机器ip和端口(映射到tgw的vip和端口),客户端再通过下发的地址信息连接团战服务。游戏过程中,客户端直接向团战服务发同步包,团战服务转发给队伍中的其他玩家。

总体来说,酷跑定位为轻度游戏,PVP中涉及的同步方案比较简单。在不同时期,根据游戏玩法、网络状况等选择了不同的同步机制和服务器架构,满足了设计需求。

手游如何克服网络延迟问题?《天天酷跑》同步机制解析相关推荐

  1. 手机游戏降低游戏延迟的软件_《和平精英》手游怎么降低网络延迟 降低网络延迟的方法攻略...

    导 读 <和平精英>手游中有很多的小伙伴们都比较好奇怎么才能快速解决网络延迟的问题了,用什么方法才可以解决的了网络延迟的问题了,有几种方法才可以解决网络延迟的问题了,相信这些都是各位小伙伴 ...

  2. 魂武者服务器维护了怎么办,魂武者手游无法连接网络怎么办?无法连接原因及解决方法...

    魂武者手游无法连接网络怎么办?是什么原因?很多小伙伴们在竞技场还有pk一般就网络波动掉线了,那么具体是什么原因导致的呢?下面是小编带来的攻略解析,感兴趣的可以一起来看下! <魂武者>无法连 ...

  3. Android仿qq网络不给力,《天天酷跑》qq授权失败网络不给力?解决_图文攻略_高分攻略_百度攻略...

    问:天天酷跑qq授权失败网络不给力?有神门解决办法 答:其实这个问题小编是没有出现过,大部分情况是因为网速的原因,然后小编重新登录一下一般就可以了,不知道小伙伴们为什么会一直显示qq授权失败网络不给力 ...

  4. 【C语言】练手游戏项目:天天酷跑1.0代码详解,包括源码,素材,第三方文件。

    C语言手写天天酷跑代码详解 项目总览: 一.项目开发日志 二.引入库与宏编译 三.全局变量与结构体的定义 四.主函数中的内容 五.逐个自定义函数拆解分析 1.初始化init()函数 2.处理用户按键输 ...

  5. 【C语言】游戏开发:天天酷跑丨完美练手项目 [附源码]

    目录 一.项目说明: 二.项目作用 三.项目技术要求 四.库.宏.主函数说明 五.项目实现 5.1游戏背景的实现 5.2实现Hero奔跑 5.3 实现Hero跳跃 5.4 优化帧等待 5.6使用结构体 ...

  6. 【Java练手项目七】Java项目实战之天天酷跑

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...

  7. 天天酷跑Python

    天天酷跑小游戏 (Python) 目 录 一.选题背景----------------1 二.设计流程----------------2 2.1算法思想------------------------ ...

  8. 天天酷跑神兽年年怎么搭配比较好 怎么得高分

    神兽年年是最新的坐骑,很多玩家都很想获得,那么天天酷跑神兽年年怎么搭配比较好,现在就让手游市场小编来为小伙伴们详解一下神兽年年高分攻略吧. 天天酷跑神兽年年怎么搭配比较好? 神兽年年搭配什么角色 神兽 ...

  9. Android版xx助手之天天酷跑外挂详细分析

    Android版xx助手之天天酷跑外挂详细分析 图/文      莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也开 ...

最新文章

  1. GAN(Generative Adversarial Network,GAN)模型之:EBGAN、PGGAN、CGAN、ACGAN模型
  2. 三十四、段页式管理方式
  3. Django modules模块
  4. 【Git笔记1】本地项目与GitHub远程仓库互联
  5. Ionic系列——调用摄像头拍照和选择图库照片功能的实现
  6. 微积分31--微分学在几何上的应用
  7. halcon write_ocr_class_svm 将OCR分类器写入文件
  8. 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?
  9. 25个关键技术点,带你熟悉Python
  10. intellij自动补全变量名和变量属性
  11. 自动控制原理:反馈控制系统的时域分析
  12. android模拟器克隆app,易语言一键克隆/启动安卓模拟器
  13. overleaf表格_LaTeX插入表格
  14. DD-WRT安装与配置
  15. 梭子鱼网络:2018年网络安全威胁预测
  16. ntp服务器安装和配置文件,NTP服务的安装、配置和使用
  17. 九度1035 -树 - 找出直系亲属
  18. 提取、修改、重建deb包
  19. Landsat Collection 2 T1一级数据详细介绍(数据处理过程和几何精度)
  20. 在cshtml文件中使用预编译语法

热门文章

  1. 第十四届浙江财经大学程序设计竞赛重现赛 ——A
  2. Oanda外汇账户2013总结 - MT4平台
  3. .gitignore不生效,不忽略
  4. java mfcc_MFCC特征提取过程详解
  5. Python模拟登陆新浪微博,爬取用户数据
  6. (一)暗黑之光RPG游戏实战心得
  7. Java入门(练习)------ 使用Java编写电脑定时自动关机程序
  8. Linux常用 学习笔记
  9. html按键使用touch,HTML touchstart事件用法及代码示例
  10. 《人生需要做减法》读后感