浮点数与定点数问题
在MOBA项目开发过程中,LFIXED类中定义了许多浮点转定点的常量。
这个类用了很久,以往的同步测试中也没有因为这些常量的使用产生过不同步问题。
然而,总觉得哪里不安全,想了很久,终于把长久以来的疑问想清楚了:帧同步游戏中浮点数为什么不安全,如何做才能安全(同步)?
对于任何一个浮点数,在不同硬件上可能数值不同,产生不同的原因是什么?
是不同硬件的算法不同吗?不是。
所有硬件都是按照浮点数的通用算法存储的,比如 0.1,
0.1f 转换为二进制的方法是不断乘2取整数部分,直到精度达到要求(并对后面的一位四舍五入)。
产生不同数值的原因就在精度问题,不同机器的精度不同时就产生了不同的数值。
由以上原理论知:像0.5,0.25,0.125这样 (1/2)的N次方的数值不会产生精度不同问题,因为它们能在精度范围内存储,
但超出精度存储范围的(1/2)的N次方的小数也可能会有问题的,如 (1/2)的24次方
其实帧同步游戏中用到的浮点数常量并不多,可以先一台机器上算出需要用到的浮点常量对应的定点数,存储到文件中,运行加载出来。
运行其间可能会用到浮点数,比如求两个数值的比例,这时候的解决办法是 A*1.0F/B ,其中A,B是定点数
至于走路同步问题,游戏启动时,各英雄位置是从文件中读取的定点数,因此保证了英雄初始位置各机器同步。走路过程中,服务器只广播方向(定点数),各端根据定点数速度和转向算出新位置,这样英雄每走一步后,其位置在各机器也是同步的