Unity帧同步

帧同步的基本原理

服务器在当帧收集所有客户端上报,再将所有客户端的输入,同步给每个客户端

严格帧同步:

等待所有客户端上报,如果有客户端没上报,流程就会卡主

帧同步优化

  • 如果有客户端没输入,不等待,流程继续往下走
  • 客户端收集输入上报服务器的tick,没必要和服务器tick一样,可以短也可以长
  • 客户端发送服务器的指令丢包导致操作无效,但游戏能进行下去,但是服务器发送的统计到所有人指令是必须要确保所有客户端都收到,不然就会出现严重的不同步,游戏进行不下去。所以需要可靠的UDP,有个KCP的开源库可以支持。但其实帧同步的框架本身是支持这种问题的,如果收到的服务器包不是当帧+1,那就认为丢包了,就可以让服务器重新发送那帧的包
  • 客户端断线重连时,服务器将开始到当前帧的所有保存状态都发下来,客户端在本地执行所有帧并跟上

手感优化

手游的网络情况比较复杂,丢包,延迟以及帧同步本身存在的延迟情况,导致优化画面或手感存在很大的问题,我们只能极大程度地弱化网络导致的画面卡顿情况。

  • 预测:对于一个30帧的帧同步来说,最理想的情况是客户端每0.03s收到一次客户端发送过来的帧信息来执行客户端的update,如果没及时收到,可以跑空帧,直接执行上一帧进行预测,当然这里只预测更运动相关的东西,战斗相关的信息(子弹,技能,buff)这些就不需要了
  • 回滚:有预测就有回滚。显示的位置不在实际位置时候,插值到实际位置
  • 预表现:客户端在按下某个技能,需要等到服务器接收,然后转发到自己接收,才能执行,这期间大概有0.1-0.2s的时间,可以针对你操控的角色在按下命令时做一些起手动作,转身动作,播放音效等。

逻辑和显示分离

定点数

工具链

  • 不同步信息查看工具
  • 录像播放工具
  • 自动战斗工具

不同问题:不要使用不确定顺序的容器