【发布时间】:2012-03-20 13:41:59
【问题描述】:
我即将为手机游戏创建一个地形,该地形允许巨大的地形,但主要受可用硬盘空间的限制。
这需要将浮点数限制为 2 个数字的“点后精度”。 有什么好的方法可以让它在点后保持 2 个数字的精度?
请记住:我在移动设备上运行,因此该方法应该快速且易于使用,并且应该适用于游戏所需的任何算术。
更多信息
我不是在谈论 空间(我知道浮点数需要多少空间,真的),我说的是当我的浮点数将有时我失去精度的问题到小数点后的多个数字。
使用int 会导致我必须将 int 转换为每帧的浮点数。我不知道转换的速度有多快,但是在为很多对象执行此操作时,这似乎会花费很多性能。 (记住我在移动设备上)。
当然我也不是在谈论地形,我是在谈论地形中的物体!地形是一个专门的系统,它实际上可以容纳一个延伸的地形大小浮动的限制很多(当你有足够的磁盘空间时,甚至可以在这个系统中保存北美,但实际上限制设置为 -99km 到 +99km )。
编辑 2
与游戏中的往常一样,运动是基于时间的,这意味着我需要将对象的速度乘以统一给我的修饰符,这会破坏我的数字,限制为小数点后 2 个数字。
【问题讨论】:
-
int是否还不够,只是让它代表您想要的最小可能精度?如,2 位小数。然后浮点问题就消失了。 1.02 然后在int土地中变为 102。 -
首先,浮点数是四个字节,无论它们包含什么数字。其次,如果你能以整数进行存储,那就去做吧。第三,如果你想在一个小空间里表现一个大地形,那么你将不得不利用某种压缩技术。地形是不变的吗?如果是这样,那么您可能能够从不可变四叉树中获得良好的压缩;对于具有大量地形资源的游戏来说,这是一种相当标准的技术。
-
好的,让我们退后一步。 为什么要限制精度?你为什么要让你的逻辑不太准确和不太准确,以及更慢,而实际上它可以更准确,更精确和更快?
-
@FelixK.:您需要在 200 公里范围内表示位置在一厘米以内。让我们把它提高到毫米精度只是为了它。只有两亿个不同的点。为它们中的每一个分配一个整数。一个 32 位整数可以容纳 +/- 20 亿之间的数字。现在所有您的计算将四舍五入到最接近的毫米。
-
@EricLippert 我有一种感觉 OP 想要将运动(力)乘以浮点数(时间),因此在这种情况下使用浮点数是有意义的,因为这种操作的结果是浮点数。他的主要问题是他不希望浮点不精确,而是希望将浮点数舍入到 0.01 精度点。我认为我的解决方案在这种情况下已经足够好了。代表所有位置也是一个有趣的答案,但它无助于移动。
标签: c# .net floating-point