侧栏导航

Moba手游的网络卡顿问题


Moba手游的网络卡顿问题怎么解决

卡顿的原因

手游卡的原因有多方面,从数据包的发送到接收角度分析:

数据包编解码

也就是玩家操作到转换成一个二进制数据包的过程

有些手机硬件性能跟不上.在这点上会玩游戏卡顿.鉴别的方法是玩单机版的游戏.观察有无卡顿

这个问题很好解决, 换手机.

数据包传输卡顿

这方面的原因很多,物理链路受干扰,路由设备超负载,黑客攻击,流量控制

这个问题,作为游戏开发者,可以做的事有

  • 优化传输协议
  • 优化同步算法

优化传输协议

常见用在实时联网游戏中的网络传输协议有TCP,比如H5游戏中的Websocket就是基于tcp的应用层协议, tcp 有几个特性决定了数据包传输延迟远大于物理距离产生的延迟,

默认Nodelay机制

Tcp为了充分利用带宽,默认Nodelay选项为false`,也就是如果应用程序一次发送的包较小,没有超过mss, 它会等一段时间再发送 , 这样无形增加了数据包的发送延迟

RTO算法的倾向性

Tcp为了不占用带宽, 其RTO(Retransmission Time Out)是跟随RTT(Round Trip Time) 的动态而动态计算的 , 其算法更倾向避免不必要的重传,这导致如果一旦发送丢包,就会也无形增加了数据的接收延迟

拥塞算法

TCP为了公平性,使用了复杂的拥塞控制算法,如果网络中某个路过的节点发生了短暂性拥塞, 它降低连接两端滑动窗口的大小,自己少发包, 以减少网络更拥塞的状况, 需要数次ack后才能恢复, 从而出现数据包累积在本地的问题. 导致发送和接收都有延迟.

改进困难

TCP由于内置于各终端系统协议栈中,极难对其进行改进

可靠的udp

udp没有上述tcp的特性,也不保证可靠性,时序性.但也好在没有这些特性,所以有优化的空间

设计一个可靠的UDP协议需要丰富的经验和足够的测试渠道.目前市场上比较出名的可靠的UDP实现有:

udtkcpQUIC

其中udt 在Netty4.x中有实现,但近几个版本被标记为弃用

QUIC在Chrome中已经支持,且实现了fec纠错,但它有另外一个名称叫HTTP3,太重,不好改造

kcp是国内开发者的作品,原始版本用1000行左右的C实现.但没有实现fec

有关kcp的介绍见:

<kcp快在哪>: ../Network/kcp

有兴趣的可以体验一下kcp加持的Android版本泡泡堂:

<手游版泡泡堂>: ../Game/GameBoy

Android版本的泡泡堂下载: http://118.24.53.22:11111/BombBoyAndroid.apk

优化同步算法

同步算法的优化这个题目太大, 需要根据具体的游戏类型和实时性要求来定. 这里不表

推荐一篇文章 https://blog.codingnow.com/2016/10/gamesync.html


最后更新于 10th May 2019
微信二维码
在微信上关注我