首页 > 如何提升移动环境下的游戏体验

如何提升移动环境下的游戏体验

公司一个卡牌类游戏上线了,但是却一直被网络问题困扰,经常有玩家投诉,老板在移动网络环境下玩的时候也经常断线。这里想跟大家讨论下,如何设计才能提升移动网络环境下手机游戏的体验。
项目的具体情况如下:
1、采用的长连接
2、通信协议
并不是一个req/resp的方式,而是一个请求指令可能会有多个服务器端的响应回来(非服务器端主动的推送)。
3、客户端没有心跳包发送至服务器端,客户端下线后并不会主动close掉socket。而是依赖服务器端开启keepalive,调整参数为3分钟检测一次。
4、在网络接口切换的时候(3g/4g切换到wifi或者相反),并没有立即重新建立连接,而是还在继续发送数据到原来的socket

针对上面的这些情况以及结合卡牌游戏的特点,我给出的建议是
针对第2点:建议在客户端->服务端的包中添加一个序号,发送之前已包序号为key注册callback,包序号一直累增,服务端处理完这个请求后还是返回相同的包序号,客户端收到服务端发送回来的包序号后调用包序号对应的callback。
但是这里还有一个问题,就是tcp的send返回成功,并不表示数据包就一定发送到网络上了。如果一个请求包发送出去了,但是一直未收到对应的响应,如果这个时候是由于网络出现问题,处理起来就很麻烦。
由于不确定请求包是否到达服务器端还是服务器已经处理了,但是响应包未能到达客户端。也就是说玩家的的状态数据有可能发生了改变。如果这个时候采取重新登录,重新获取玩家的状态数据,这个过程就会耗时较长,而且这种情况在移动环境下经常发生,会严重影响玩家体验。
而如果是仅仅是重新建立连接发送未收到响应的请求,服务器端就需要缓存下之前请求的处理结果,如果发现对应包序号的请求已经处理过了,就直接返回上次的响应内容,而不再处理一遍。
对于这种情况,大家是否有些好的处理方式或者建议
针对第3点:我的建议是在应用层做心跳包检测,由客户端发送,因为移动环境的不稳定性,建议30秒一次,尝试3次还是失败,就直接close掉socket,重新建立新连接。
针对第4点:监听android或者ios上的网络接口切换事件,一旦发现原来有网络接口切换,停止发送数据,关闭掉原来的socket,重新建立连接。

以上都是个人的一些建议,欢迎大家讨论,或者给出好的建议。

【热门文章】
【热门文章】