射击类MOBA游戏帧同步:浮点精度测试

最早接触帧同步的概念是在2005年开发PS游戏高智能方程式赛车3的时候,当时负责赛车游戏的逻辑,物理,AI和录像回放等功能,录像回放就是使用点帧同步实现的。一场比赛只要保存玩家在不同时刻的操作即可,回放的时候就再跑一遍游戏在相同的时间执行相同的操作,得到相同的结果。对于主机游戏来说帧同步实现要简单很多,因为设备唯一,不存在浮点精度的问题,甚至都不需要逻辑层和表现层分离,只要简单的限帧即可。
 



2015年开发一款3D战斗卡牌游戏的时候又使用了帧同步技术,因为当时服务器只有一个人战斗逻辑在客户端,一开始使用主机模式问题很多,迫不得已临时改成帧同步。因为是中途改的所以实现比较简单,使用FixedUpdate对逻辑限帧,使用TCP,可以说问题还是很多的。但因为1V1的横版游戏,玩家操作频率非常低,战斗也相对简单,有些不同步和延迟也还能接受。当时因为时间紧迫,开发的时候就遇到一个不同步问题解决一个,例如脚本更新顺序,逻辑帧更新等,其实也发现有浮点精度的问题,但因为时间有限只是对一些地方做了截断保护,后续项目又改成状态同步了也没有深究。

后来也了解过同类型游戏刀塔传奇的帧同步,刀塔传奇逻辑使用lua脚本,双精度浮点数double的精度问题比float好很多,另外2D游戏的运算相对3D简单,当时只遇到过一个数学运算有问题做了特殊处理就解决了。

最近在做一款射击类MOBA项目的时候,又采用了帧同步技术(帧同步和状态同步的对比和选择后续做更详细的介绍)。这是一款3D物理的俯视角射击MOBA项目,游戏中大量运用了真3D物理运算,双摇杆射击,最多支持16人战斗。游戏节奏非常快,操作频率非常高,一直会有大量玩家同屏团战,每个角色射速极高每帧有多发子弹,每个子弹都有弹道和物理计算,是一款对性能和延迟要求非常高的游戏。这时候同步就不能有一点问题了,任何一个Error或者运算的不同步就会导致结果的巨大差异,并且非常显而易见,使游戏无法进行,因此浮点精度问题也必须得到彻底解决了。

浮点精度的问题在PC上就有跨平台的问题,因为语言编译器不同使用的寄存器和运算过程中的舍入方式不同。就会导致在不同平台下相同的float运算会出现不同的结果,这方面有很多文章阐述就不多做阐述。而在手机上IOS还好比较单纯,Android设备系统硬件千差万别就更容易出现精度问题了。

首先我做了一些单元测试。
 


 



*如上图,通过简单的单元测试函数对各种常规的数学运算做了测试。

测试方法是:

· 首先在Windows64位电脑上生成浮点型测试数据,然后通过测试函数执行n次运算。

· 将测试结果的二进制保存到配置文件中。这里需要说明的是因为float是小数点后7位,在编辑中最多可以显示到9位例如1.876777650比较起来不直观。另外也存在多个十进制数据对应一个二进制浮点数的情况,例如在编辑器中看到5.0,保存之后再读取显示可能就是4.9999999,他们两个对应相同的二进制是一样的。为了便于对比,我写了一个简单的函数将各种类型统一转成二进制,保存的时候按二进制写入和读取,输出的时候也对应输出浮点数的二进制表达方式。
 



*如上图,将各种类型转换成二进制字符串的函数。

· 在其他各种设备运行测试程序,读取浮点测试数据,执行相同的运算,显示测试数据和运算结果的十进制和二进制结果。

· 读取Windows64位电脑上的二进制测试结果,和当前运算结果进行比较,如果不同显示Error,并显示双方的二进制结果。

结果如下:
 



可以发现连简单的x*x+y*y+z*z计算就出现了结果不一致,并且x*x,y*y,z*z和x*x+y*y都是一致的,就是y*y+z*z出现了不一致,猜测可能是不同设备的寄存器使用和舍入方式不同导致的误差,任何一个数学运算都有可能出现。

进一步测试:

· 进过更细致的测试,我发现Windows,IOS,Android三个平台之间会出现float运算结果不一致的情况,其中Windows设备之间、IOS设备之间是一致的(也可能设备较少),Android平台下即使同一个平台不同机型之间也会有大量运算不一致。并且各种运算都有可能出现,没有规律可言(例如某个只有数学运算不一致)。

· 此外我又针对Unity的Physx物理引擎做了精度测试,QQ出售平台创建一个3D世界,随机分布各种几何体胶囊,球,茶壶,立方体等等,然后从原点位置随机发射1000根射线,再用相同的方式记录和对比结果,最终发现物理运算也出现了不一致的现象!



· 最后我还让做AI的同事对Unity的Navmesh做了测试,在一张带Navmesh的场景上生成10000个测试路径对比。这次结果就比较有趣了,结果居然是一致的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值