因为最近在做一些事情,讨论到了实际发射间隔。
按照原先的帖子和原先的运行逻辑,发射间隔应为
30*50/射速
。
然而取整方式不明,所以本人做了以下测试。
50射速与25射速
按照理论,向上取整,那么可以得到50射速的帧数为31帧,而25射速的帧数为61帧,可知,25射速发射一次略快于50射速发射2次
然而实测情况下,25射速却略慢于50射速发射2次。
这个时候我注意到一个问题——就是float的取整。
我们知道,少前的运行速度被限定在30帧,无论实际运行速度如何,内部时钟会尝试每过1/30 s进行一次数据刷新。而从(50/射速)秒 变成一个按帧计数的,则使用以下逻辑 (int)(50/射速/Time.fixedDeltaTime)
这个间隔是Time.fixedDeltaTime 固定增量时间,也就是unity引擎控制的一个理论上每一帧的更新时间,查询unity库可以得知fixedDeltaTime返回为float形。
学过计算机的朋友都清楚一件事情,float形返回1/30,并不等于0.03333333……通过vs2015 c# print(1f/30f),可以获得float(1/30)=0.03333334,而0.03333334大于0.0333333333……
这里文章就来了,如果当 (int)(50/射速/Time.fixedDeltaTime)运行完毕,那么返回的数值是否会因为这个误差而造成影响。
那么我们来print一下在25射速和50射速的情况下,到底返回值是多少。
可以看到,在返回值强行转换为int的时候,有1帧被
续掉
了。然而如果返回值用float来直接显示,是不会丢失这一帧的,这也就是0.03333334造成的实际误差,也就是说,当50/射速是0.0333……的倍数的时候,会有一帧因为取整而被
续掉
。
在这种情况下,我们重新获得50射速的帧数为29帧,而25射速的帧数为59帧,符合我们所观察到的情况。
为了证明我的说法是正确的,我重新挑选了3种情况。以下视频验证补充。