学习原文:《网络同步在游戏历史中的发展变化》作者: Jerish
承接上文,文章里还介绍了虚幻和守望先锋如何处理同步问题,因为没有设计具体的理论知识,所以就没有记录了。有兴趣的自己看原文。
物理同步
概念 在较为复杂的物理环境或者有物理引擎参与计算的游戏内,对持有物理信息的对象进行同步。难点 1、物理引擎的不确定性 2、物理引擎参与模拟,网络同步微笑的误差将会被迅速放大。
物理引擎的不确定性 因为不同平台、编译器、优化版本都会影响确定性,主要是编译器优化后指令的执行顺序,约束计算的顺序,不同平台和版本浮点数精度问题。误差放大 首先本地客户端控制对象 肯定是快于远端客户端的控制对象 ,还有就是关闭物理模拟的时机
TCP存在的问题
- TCP有个Nagle算法会积攒小包,然后再发送,这会影响游戏实时性,可以通过TCP_NODELAY设置。
- TCP一旦发送丢包和乱序,这时只能等待这个丢失的包收到才会传输给上层,这时可能出现超时重传。
- TCP的拥塞控制和流量控制将会不可控,在网络环境较差的时MSS(最大分段大小)将会降低一半,TCP的接收窗口将会限制发送端发送数据。
- TCP报头占用字节等等
常见同步优化
表现层(弱化客户端对延迟的感受)
延迟对抗(弱化客户端对延迟的感受)
- 延迟补偿、命令缓冲区、通过实现技巧,例如前摇时间(比如客户端扔手雷播放投掷动画并向服务端发送消息,服务端接收后直接生成手雷而不去播放动画)。
丢包对抗(弱化客户端对延迟的感受)
- 使用TCP而不是UDP、冗余UDP包(一次性发送多帧数据,UDP容易丢包,多发几个只要到一个就可以获得完整数据)
带宽优化(减少延迟)
同步对象裁剪 ,剔除不相干的同步对象,常用的有SOI(势力范围) 、静态区域(将场景分为N块,不在就剔除) 、视锥体裁剪 、八叉树裁剪 、还有AOI(维护一个动态视野,视野外进行剔除) 。分区、分房间 不同区域由不同服务器接管数据的压缩和裁剪 然后对于状态同步可以采用曾量同步(只同步变化状态)。减少遍历
帧率优化(减少延迟)
提升帧率 GC、IO、低效率遍历循环、Drawcall等等帧率的稳定 计算压力的分担 将服务端计算压力分担到客户端
|