网络优化的一些 tips
December 2, 2022About 2 min
网络优化的一些 tips
按延迟、抖动、丢包三类问题归纳的网络优化要点,以及客户端侧常用的延迟掩盖手段。
网络延迟(Latency)的四个来源
- 处理延迟(Processing delay):路由器处理数据包本身花的时间。
- 传输延迟(Transmission delay):把比特写到物理介质上的时间。
- 尽量发大包:包越大,花在包头上的字节占比越低。
- 排队延迟(Queuing delay):包到达路由器的速度超过其处理速度时,会在路由器里排队。
- 发少量大包,而不是大量小包。
- 传播延迟(Propagation delay):信号在介质上「跑路」的时间,受物理距离限制,基本无法优化。
网络抖动(Jitter)
抖动会让包乱序到达。
- 应对乱序:要么用 TCP(它保证顺序),要么在应用层自己重排。
- 尽量少发包,把流量压低。
- 帧率不稳也会引入抖动——发包节奏跟着帧率波动。
丢包(Packet Loss)
丢包可能发生在:
- 不可靠的物理介质;
- 不可靠的链路层;
- 不可靠的网络层。
应对上同样优先发少量大包,而非大量小包——小包多意味着包头开销大、且每个包都有独立丢失的概率。
延迟处理(客户端侧)
三种经典手段,掩盖网络延迟带来的不一致:
- 客户端插值(Client Side Interpolation):在收到的状态之间插值,让其他实体的运动看起来平滑。
- 客户端预测(Client Side Prediction):本地先按输入预测自己的行为,等服务器确认再校正。
- 服务器回滚(Server Side Rewind):服务器按玩家的延迟把世界回退到他开火那一刻再判定命中,即 favor-the-shooter。
参考
- 《Multiplayer Game Programming: Architecting Networked Games》