1.为何不靠谱?
众所周知,在使用帧同步的情况下最好不要使用Unity自带的物理引擎。
具体为什么不同步,网上给出的答案全都是会造成不同步。
因为Unity自带的物理引擎内部是由浮点数参与计算的,而浮点数在不同平台产生的结果也不一样,就导致了结果有所浮动,且不一致,所以就造成了不同步。
因此就衍生出了定点数。
而帧同步为了保证各平台同步的情况下,则必须使用定点数。
虽然说网上都说要使用定点物理库来保各平台的一致性。
但肯定会有不少人会去巧妙的构想:在使用定点数保证两名玩家位置一致,旋转一直,操作一致(在同一帧)的情况下,也就是绝对同步的情况下,使用Unity自带的物理引擎,进行碰撞,会不会得到相同的结果。
带着这个思想,咱们就去探究一番Unity物理系统的计算会不会造成不同步。
2.测试环境
1.首先保证两个客户端:
扫描二维码关注公众号,回复:
14674289 查看本文章
- 位置一致
- 旋转一致
- 输入一致
2.然后在角色的武器上添加Unity的BoxCollider,在角色身上添加刚体,达成碰撞条件。
3.攻击时通过武器碰撞敌方玩家的回调,来播放对方玩家的受击动画。目的就是为了测试碰撞算法的准确率。
3.碰撞演示
下面是测试效果:
4.测试结果
在同一台电脑的模拟器上 进行了多次测试,保证两个玩家位置、旋转、输入、一致的情况下,碰撞算法得到的结果却不稳定,有不小的浮动性。有时结果一致,有时结果不同,甚至在一致结果的情况下会出现两种不同的表现结果。
猜测是物理系统内部浮点数导致计算结果具有上下浮动值,从而产生了在一台设备上的结果不同。
所以帧同步最好还是要使用定点数物理库,否则游戏过程中出现一个不同步,就会影响后续的计算。
或者在击中判定采取定点物理计算的方式,来保证不同不平台下的结果一致性。
所以在帧同步中,还是要避免掉一切有关于float浮点数相关的计算,否则会造成不同步问题。