帧同步优化难点及解决方案
帧同步这部分比较复杂,细枝末节有很多优化点,也有一些不同的优化方向,根据不同项目类型、对操作手感的要求、联机玩家的个数等,会有不同的难点和痛点。不同的优化方向,优化手法的差异,可能导致一些争论。并且,帧同步,本身也有很多变种,以应对不同的需求。所以,本文一切都是基于作者的项目类型(ACT)来做的方案和优化,并不一定适合其它也需要帧同步的游戏,故在此提前说一下,以免引起一些不必要的误解。 帧同步的几个难点 帧同步的基础原理,以及和状态同步的区别,已经有很多文章介绍,我就不再赘述,大家可以自行google。以下只说几个难点。 保证客户端独自计算的正确,即一致性 帧同步的基础,是不同的客户端,基于相同的操作指令顺序,各自执行逻辑,能得到相同的效果。就如大家所知道的,在Unity引擎中,不同的调用顺序,时序,浮点数计算的偏差,容器的排序不确定性,Coroutine内写逻辑带来的不确定性,物理浮点数,随机数值带来的不确定性等等。 有些比较好解决,比如随机数值,只需要做随机种子即可。 有些需要注意代码规范,比如在帧同步的战斗中,逻辑部分不使用Coroutine,不依赖类似Dictionary等不确定顺序的容器的循环等。 还有最基础的,要通过一个统一的逻辑Tick入口,来更新整个战斗逻辑,而不是每个逻辑自己去Update。保证每次Tick都从上到下,每次执行的顺序一致。 物理方面