移动平台游戏网络重连方案(转)

 1、背景

  移动网络信号波动频繁,给移动游戏开发者带来诸多困扰,处理不好会造成较差的用户体验以及重复扣道具等严重问题。因此弱网络问题在TDR技术评审中作为客户端重点挑战项,并且弱网络专项测试达标后方能上线。本文就过往项目中遇到的问题给出一种比较通用解决方案。

  2、网络连接方式

  通常游戏客户端都是通过创建socket与服务器取得连接,但也会根据使用场景划分成两种连接方式:TCP连接和HTTP连接。

  1) TCP连接即我们常说的长连接。这种连接方式下socket连接一旦建立,通信双方即可相互发送数据,直到一方终止连接。目前公司的移动端联网游戏多采用这种数据通讯方式。

  2) HTTP连接即我们常说的短连接。这种连接采用的是“请求-响应”的通讯方式,每次交互由客户端发起请求,服务器收到请求后才能回复数据,数据传输完成后,socket连接便断开。在下载CDN资源或云配置时通常会采用这种连接方式。

  3、网络检测

  3.1 检测设备的网络环境

  iOS和Android都提供了检测本地网络环境的方法,具备我们需要的功能:

  1) 网络环境标识,区分当前网络环境:WIFI/WWLAN/NOTREACHABLE等。

  2) 网络切换感知,网络环境切换后会收到系统消息。

  在苹果开发者网站(developer.apple.com)上有一个reachability的例子,对底层网络组件做了封装,可实现此上的功能。Android上提供了Connectivity Manager服务,可加以封装实现同样的功能。附录中提供了相关的开源代码,并分别封装了reachability在iOS和Android平台上的实现。

  3.2 检测心跳超时和回包超时

  心跳即每一定时间间隔(假定15秒)客户端和服务器进行一次请求/应答,来判断对方是否存活。若客户端发送请求成功后,长久(假定60秒)未收到服务器的回应,则认为连接已经中断或者服务器宕机。若服务器长久(假定300秒)未收到客户端请求,则可以认为客户端已经离线。另外常规的业务数据包也可以认为是心跳包的扩展,所以每次业务数据包通信成功,客户端和服务器都要重新计时。一般心跳包是一个空的数据包,以节约流量,但通常也会包含少量字段,比如客户端和服务器的时间同步信息等。

  一些关键协议,比如进入房间的请求,需要等待服务回应后才能扣除体力进入房间。但网络不稳定时,可能客户端的请求发送成功,服务器的回应却迟迟没有收到,这种情况下,客户端需要做一个超时控制,比如15秒后客户端还没有收到回包,则给出提示,不能让客户端无限的等待。这种因果关联的一对协议我们称作请求-应答协议,建议所有关键协议都采用这种机制。有一点要注意,这种异步操作有一个等待的时间,一般这段时间都会屏蔽输入(转菊花/show activity indicator),避免用户进行其他操作导致重复请求。这也要求我们在代码逻辑层面上避免多个关键协议的嵌套和并发。

<ignore_js_op>

  3.3 检测发包失败

  一般来讲reachability足够灵敏可靠,设备网络发生变化时能及时感知,只要监听到状态切换为NOTREACHABLE便可认为断线了(需要排除瞬断的情况),但reachability也有限制,无法感知到传输层连接断开。举个例子:手机和无线路由器连接正常,但是无线路由器和modem连接中断,这时reachability是检测不到网络断开的。此时需要依据socket错误码来判断网络情况。

  3.4 检测socket状态

  以上几种机制都是在应用层做网络状况检测,基本上可以应对大部分情况,但有时为了更好的用户体验,我们需要更加精准的检测方式。获取socket底层错误码及状态能为我们提供更多的判断依据。因实际项目中并未用到这方面的内容,便不在这里扩展。

  3.5 检测网络延迟

  某些类型的游戏对网络延迟特别敏感(如实时对战类游戏),较高的网络延迟将会导致惨不忍睹的体验。这些类型的游戏不但要从技术层面做优化,同时也要根据用户当前的网络延迟加以限制。比如平均延迟在1000ms以上便提示无法游戏。我们可以采用两种方式评估延迟:信号强度(received signal strength indication)和收发包时间统计。

  1) 信号强度(RSSI)检测:这种判断网络延迟的方式不具客观性,因为网络延迟不仅取决于信号强度,同时受到带宽、传输节点数、网络硬件吞吐量等一系列因素的影响。但在其他参数相对固定的情况下,我们仍然可以参考信号强度来评判网络状况,同reachability类似,RSSI能及时给我们当前网络状态的反馈。在Android平台上使用WifiManager类可以获取具体RSSI值及信号强度等级。不幸的是iOS 5.0及以后的系统都不再支持RSSI的获取(当然jailbreak之后还是可以的)。

  2) 收发包时间统计:即在客户端和服务器时间同步的情况下,每个数据包带一个时间戳信息,基于过往的数据包计算平均网络延迟。这种检测方式相对合理,但是时效性较差,在网络波动频繁时不能及时正确评估,相反在连接平稳的网络环境中,会得到理想的效果。

  在Android平台上要取得一个合理的网络延迟,可以结合以上两种方式。iOS平台上暂时还只能采用第二种方式。

  4、断线重连机制

  当检测到断线后,便可以启动重连模式。根据当前的游戏状态确定重连策略,一般有以下三种方式:

  1) 静默重连,即在用户无感知的情况下进行重连。一般检测到断线后,可以先尝试静默重连一定次数(比如3次)。如果在游戏对战过程中断线,一般也会尽量尝试静默重连并且忽略重连次数,因为此时弹出提示框会打断对战体验的完整性。静默重连提供了一种友好的用户体验,能应付一些短暂的网络中断(比如进出电梯或者进程从后台唤醒等)。

  2) 显式重连,在静默重连一定次数(假定3次)之后,仍然无法连接成功的情况下,此时需要弹出提示框,中断游戏流程,告知用户当前网络环境较差,引导用户在网络较好时再尝试连接。

  3) 服务器故障重连,这种情况下客户端无论如何是连接不到游戏服务器的。此时客户端也需要给出正确的引导,而不是误当作断线故障处理。因此我们在断线重连失败之后多加一个步骤:尝试连接CDN服务器,若CDN服务器可以正常连接,那么说明网络畅通,我们去获取CDN上的云配置,检查是否有服务器日常维护的标识,如果有则给出服务器日常维护的公告,否则可以认为服务器宕机,则给出服务器故障的公告。此步骤中若CDN服务器也无法连接,说明网络确实不畅通,可以继续走重连流程或者等待。

  5、网络协议的制定规范

  要做到良好的重连体验,不仅需要良好的解决方案,也需要有协议上的支持。通常协议制定时可以参考以下规则:

  1) 登录协议尽量简单,仅包含必须的字段(如玩家等级,金钱,体力等)。一般重连即需要走重新登录和鉴权流程,精简的登录协议能提高重连效率和节约流量。用户的非关键校验数据(比如背包数据,排行榜,卡牌信息)等可以延迟到界面开启时再请求或者使用本地缓存数据。

  2) 协议的解耦,不同业务逻辑需要的请求包不同,这里就需要进行协议解耦,减少冗余数据,降低传输的包量,提高单包发送成功率。

  3) 支持数据包压缩,对于较大的协议包(比如排行榜数据,好友数据等)需要做针对性的压缩,提高单包发送成功率。

  4) 关键协议需要添加序列号,避免客户端重复请求造成的多次扣费等问题。

  6、CDN资源下载方案

  随着硬件和技术的发展,移动游戏品质也和PC端游越来越接近,当然资源量也越来越接近。受限于移动网络带宽,较大的安装包给玩家设置了较高的门槛,因此目前的手游产品也越来越多的考虑微端方案。即安装包只包含部分游戏关卡,或者只作为一个下载器,而完整的游戏资源放在CDN资源服务器上,然后按需下载,这也是一般页游的思路。这种情况下,我们对比了几种打包机制给大家参考。

  <todo>测试数据稍后提供</todo>

  附录1:断线重连流程图

<ignore_js_op>

  附录2:RSSI信号强度分级

<ignore_js_op>

时间: 2024-10-10 02:25:26

移动平台游戏网络重连方案(转)的相关文章

网络远程教育实施方案交流之(二)——网络教育平台项目的建设

网络教育平台项目的建设的方案能够自建也能够採购.但项目是否成功,并终于能够落地发展,还须要业主方认真的调研和分析,最有效的方法就是利用项目管理的方法,从前期的需求分析.调研.可行性分析,立项,建设期成本.质量.进度三大管理,后期測试bugfree,维护.客服服务等. 管理内容看起来复杂,事实上理顺了非常easy,大道至简.下面先从功能模块入手,然后再介绍实践和经验,其目的是让没有经验的读者少走弯路,具有相关经验的管理者分享交流,共同推动此项事业的发展. 曾有人问我项目是不是资金投入越多越好?事实

腾讯游戏数据自愈服务方案

腾讯游戏数据自愈服务方案简介 1. 引言 在正式介绍项目背景之前,让我们先看一组数据: 这是2个灰度的业务,都是Z3服务器,我们先只从时间成本的收益角度来看: ⑴  左一业务数据量是330G,数据不一致时通过重做slave需要150分钟左右,而借助pt-table-sync只需要5分钟,速度提升30 倍. ⑵  右一业务的量是93G,通过sync工具花费3分钟,而如果重做slave要35分钟,速度提升12倍. 引入这组数据意在指明,整个过程不仅解放了DBA的双手,也符合"零运维"的趋势

基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视.希望与大家共同交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 #define HOME "/" #define TIOCSCTTY 0x540E #define TIOCGWINSZ 0x5413 #define TIOCSWINSZ 0x5414 #define ECHAR 0x1d #define PORT 39617 #define BU

公有云及私有云、混合云网络VPN组网方案

公有云及私有云混合云网络VPN组网方案 目前云上业务已经越来越成熟,稳定性也比私有云要高,但是任何一家企业不可能将自己的核心生产数据全部一股脑的搬到云上,至少这是目前中国的现状. 国内市场份额最大的是阿里云,腾讯等,海外的是AWS,Azure,IBM等:今天我要介绍的是关于国内企业把云部署到海外的同步建议方案. 各大平台均支持云直连服务,也叫direct connect各家有不同的叫法,总之最终就是让你拉专线到他们机房去.这种方法最直接,但是也有其它问题,价格贵,还有就是多个云无法共享,如我同时

[原创] 针对某P2P业务平台制定的系统拓扑方案

本文只代表作者在一定阶段的认识与理解. 一.写作前提 最近一个朋友找到我,说他们公司期望做一个Web Application,请我帮他们做一个系统平台的拓扑方案,需要考虑到相关系统负载问题,鉴于此需求,制定本文的设计方案(无法公司应用及企业信息). 环境信息如下: 开发语言:PHP 5.3, Object C,Java: 数据库系统:My SQL 5.5: 应用平台:XXX4.0平台. 二.本文内容 系统架构及说明 近期实施方案 长期实施方案 总结 三.系统架构及说明 依据对平台需求的总体分析,

HTML5 2D平台游戏开发——地图绘制篇

此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-based,即基于瓦片风格和美术风格两种.Tile-based的典型代表是<Super Mario>(超级马里奥),Art-based记不太清楚了,能够回想起来的是去年出的一款叫做<Owlboy>(猫头鹰男孩)的游戏.      Super Mario  Owlboy 由于Art-based的

游戏网络编程(三)——WebSocket入门及实现自己的WebSocket协议

(一)WebSocket简介 短连接:在传统的Http协议中,客户端和服务器端的通信方式是短连接的方式,也就是服务器端并不会保持一个和客户端的连接,在消息发送后,会断开这个连接,客户端下次通信时,必须再建立和服务器的新连接,这就是短连接.在短链接的情况下,客户端必须不停的主动发起请求,而服务器始终被动的响应请求,来推送回数据.这种方式用到游戏开发中,显然是不适合的. 长连接:那么与之相对的就是长连接了.在长连接的情况下,客户端和服务器端始终保持一条有效的连接,那么客户端并不需要不停的主动发送消息

游戏网络编程(二)

游戏网络编程(二) 本篇介绍Socket编程,因为我觉得每个开始接触网络编程的人应该都是先从了解socket编程开始的吧.后面介绍的WebSocket也会和Socket编程的概念做比较,因此先介绍下Socket编程. 游戏网络编程二 什么是Socket 常用的Socket函数API WinSock CSocket Socket函数介绍 socket bind listen accept connect sendsendto recvrecvfrom select setsocketoptgets

Cocos2d-x中由sprite来驱动Box2D的body运动(用来制作平台游戏中多变的机关)

好久都没写文章了,就来一篇吧.这种方法是在制作<胖鸟大冒险>时用到的.<胖鸟大冒险>中使用Box2D来进行物理模拟和碰撞检測,因此对每一个机关须要创建一个b2body.然后<胖鸟>是依据<超级马里奥兄弟>设计的,所以机关能够是各种运动轨迹的平台,绕圈转的乌龟,蹦蹦跳的乌龟等.假设用box2d来做这些运动的话要自己写这些轨迹.可是Cocos2d-x已经提供了非常多的action,自己添加action也非常方便.反过来用sprite去设置box2d的b2body