浮点数精度误差带来的一个BUG

        浮点数我想没有程序员不了解的,大多情况下浮点数是可以满足精度的。32位的浮点数在数值很小的时候精度非常高,但是浮点数的精度不是线性分布的,这就导致数值越大误差会越大。

        树叶有动画在现在的游戏里是一件很稀松平常的一件事情,简单说来无非是sin cos一堆算就可以了。是的,一般是sin(time*frequency),就可以做出来最简单的周期动画,为了让动画看起来不是那么一致可能会是用sin(pos+time*frequency),这样在不同位置的树的动画就不是一样的。这样挺好,没啥问题。但是有时候会发现树的动画感觉跟抽风一样会有跳帧的感觉,想了很久也没想出来什么原因,回到家里躺在床上还在想到底为啥呢,想着想着差不多睡着了,忽然想起来似乎有些树是不跳帧的而有些树是跳帧的,想着想着有什么不同呢,结果睡着了,第二天早上一到公司就想找出来哪些树有问题,那些没问题,他们之间有什么不同,找了个小地图试,试了半天似乎都没问题,但是打开大地图就很容易出现问题,看来和地图大小是有关系的,但是也不对大地图上好像有些区域树也是不跳帧的,也没什么规律可言,观察了很久终于发现的确是有规律的,好像是离原点近一些的树是不会跳帧的,远一点的一定跳帧,马上新刷了几个树验证了一下,果不其然,离原点越远树顿卡的越厉害,但是跟动画相关的只有pos+time*frequency,看起来pos+time*frequency比较大的时候似乎有点奇特,写了个小的测试程序,把sin(pos+time*frequency)打印出来,发现随着时间的增长打印出来的值有很多是相同的,原来这就是为什么感觉跳帧的原因,在大地图pos很大的时候有409600.0这对于算sin来说已经是一个误差很大的数字了,所以需要让pos+time*frequency保持在一个比较小的范围就可以觉问题了,这样方法就很多了pos直接除以1000顿卡立马就没了,当然随着时间增长,所以最好是取time的小数部分和frequency乘,这样就完美解决了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值