将值添加到 Java 中的浮动速度减慢到 512

Adding values to float in Java slows down at 512

这一行在循环中执行:

shape.setPosX(shape.getPosX() + (.005f * (float) getDelta()));

getDelta 是自上次循环以来经过的毫秒数,通常为 ~0.001。

setPosX 接受并存储浮点值。

getPosX,如你所料,returns浮点值

绘制形状时,我看到它在屏幕上稳步移动,但一旦 X 达到 512,它就会减慢 10 倍。我可以 100% 地重现它,所以它是一个相当大的障碍.

这里可能发生了什么?

问题是您使用的 float 没有足够的精度来表示数字。您可以通过告诉 Java 确定是否 (512f + 0.005f * 0.001f == 512f) (it is true.)

来检查这一点

在 32 位浮点数中,对于 256 到 512 之间的值,尾数的最低有效位在 .00003 左右,这恰好足以让您的 getDelta() 推过去(这表明您假设 0.001f 的平均值可能是错误的)。对于 512 和 1024 之间的值,尾数的最低有效位加倍为 .00006(因为指数部分多了一个)。你的 getDelta returns 大约每 5 次四舍五入一次,因此速度变慢 ten-fold.

你可以玩 floats here.

解决这个问题的方法是让你的号码成为 double

有趣的琐事:浮点运算导致 Minecraft 在高坐标下表现得很有趣。 this page 中描述了这些影响,尽管实际错误可能只是整数溢出。