当下国内的游戏公司应该都必定程度上参和到手游市场了的吧?不少的游戏开发人员都是以前页游过来的,在程序设计和功能实现上都延续了页游的那一套思路方法,原则上来是对功能实现上并不存在任何的问题。可是细细分析下里面是存在着一些点能够被优化或者说直接是坑。前端
我我的经历过三个手游项目,两个卡牌一个MMO,接下来提出来的点多是会傻逼。可是我明确的知道不少项目都是比较随意的去对待这些问题的,因此才有了我一系列的小文章来论述这些问题。但愿你们在开新项目的时候能够尽量的避开这些底层设计控制的坑。后端
顾名思义手机游戏,绝大多数的状况下都是运行在手机环境下的。手机对比电脑不足之处实在是太多。这边就围绕着接下来的问题提出几个关注点:缓存
由于手机网络的不稳定性,致使手机游戏的频繁的断开、重连网络是很是常见的现象。在页游时代这个行为是一个F5(刷新)就搞定的事情,可是在手机时代这个方案明显行不通。因此咱们有了下面这个话题:服务器
在开始这个话题以前我用wireshark工具抓包了以下几个游戏并简单观察其机制(不必定是对的)网络
以打副本为例子:app
总结:socket
内容表现很是的多,我单测试这个就用了一个上午的时间,这边也不浪费你们的时间直接来看结论和合理的设计:tcp
分析下网络中断的状态和行为能够分为以下四种:工具
从四种断网方式中能够判定出玩家的接下来行为:性能
对于服务器来讲,除了第一种状态下服务器知道玩家是下线状况外,其余的三种状态服务器是没法区分的,由于对于服务器来讲都没有主动收到前端的fin包(网络中断)的包,这也就是为何基本上全部的游戏都有心跳包的缘由,其实就是用来界定网络是否还存在的状况。
在传统的页游中,主要发生了断线行为都是直接把数据存档,内存数据消除。听起来好像没有问题,可是回去分析玩家行为时会发现,其实后两种行为在切回游戏界面时是能够继续进行游戏的,这个时候若是把数据dump有两种状况:
其余的细节就不追究仍是直接来看结论:
临时数据
手游状况比较特殊,基本上能够说全部的数据都必需要入库处理操做好点。最容易联想到的现象就是别人早上打开游戏,而后home键到后台,晚上再继续游戏,不入库的话根本掌握不住这个时间点。临时缓存数据也须要入库操做,通常会加上时效性。
服务器的重连
若是仅仅是经过socket来进行标记,服务器是没法判断是不是重连。也就是说走的路线都是重登录了。因此这个时候前端跟服务器重连时必须给服务器带过里标记: 重连、登陆标记。服务器根据这两个标记刷新数据、推送数据。(好比重连不须要额外推送红点和数据,重登录的话可能须要把上一把的临时数据的存档清楚)
先后端数据同步
在后面2中状况下(从新切回主界面),若是涉及到跨天或者活动相关的推送时是会比较尴尬的。好比说:跨天刷新数据,本来是要把缓存数据都清楚而后从新获取,可是由于进入了后台得不到cpu使用权就丢失了跨天的回调,致使久数据没法刷新;活动推送若是在登陆状态下回直接推送、重登录也会出发推送,可是对于重连通常不会触发推送这个点也是比较尴尬的。因此也有一些作法是作成进入后台xx小时,同时重连的时候跟打开app的时间不在同一天都会触发游戏从新登陆的(kill app 重连)。
流量是人民币,若是不珍惜也会对留存形成必定的影响哦。
由于手游开发人员广泛来源于页游,页游这块网络的不须要太多的考虑的。因此前端的缓存作的是相对来讲比较少,都是直接跟服务器请求数据的,可是再手游状况下听起来就以为不怎么妥....
废话很少说直接说结论:
合并数据包
对数据进行合并操做,在网络出口处,若是在一个瞬间又多个包同时推送给同一个玩家须要对包进行合并操做。 一个tcp的包头最小20字节呀(很大),因此能合并就合并下吧。
数据前端缓存
在协议商定时额外的带多一个标记位,用于指定是获取更新数据呢仍是获取所有数据。(建议本地有缓存的状况下都作更新数据处理),对于切tab操做(手残党最喜欢作),尽量的避免反复请求。 切记:别作成每次打开界面都跟服务器拿数据。
分批按量发送
数据分批份量来推送,避免推送大数据,最典型的表明就是排行榜、拍卖行。
数据扁平化设计
例如把一个int数据拆出来表示多个字段的意义。
数据压缩
对于大于xx字节的数据包进行压缩。
当前市场上不少游戏插着充电线电量都仍是在减小的。也有游戏玩一会手机就成为了暖手炉的。
这两个点影响流失的比率仍是比较高的。我就卸载不少这样的游戏。想一想你的手机本来充满电用一天的,可是如今玩了一会游戏就要自动关机了。想一想你用你的双手握着一个暖炉的时候是怎么样感受....
那么怎么来下降这两个点呢:(由于我主要是后端,这个点可能点的比较虚)
这里的结论可能并不必定都是最好的,也可能考虑到的点尚未那么全面。欢迎前来拍砖...
(本文的结论基本上都是通过线上测试验证过的,并非本身臆想天开得来的)