首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libgdx能否在其坐标系中存储非常大的数字?

Libgdx能否在其坐标系中存储非常大的数字?
EN

Stack Overflow用户
提问于 2017-08-31 22:32:40
回答 2查看 315关注 0票数 2

我正试图用一个科学精确的太阳系来编写游戏,并试图找出在大规模使用坐标的最佳方法。当我在Libgdx中读到坐标系统时,它说它使用“浮点”来存储坐标数据。

我想让厘米的精度达到大约55亿公里,也就是小数点12位。恐怕当坐标这么大时,坐标就不准确了。

有人能解释一下这件事吗?

EN

回答 2

Stack Overflow用户

发布于 2017-09-01 09:30:39

理想情况下,您希望创建使用你自己的矢量版本BigDecimal,因为您可以控制意义的数量。因此,BigDecimal表示的数字的值是(unscaledValue×10-scale),见Javadoc.

票数 1
EN

Stack Overflow用户

发布于 2017-09-02 00:56:45

提出有趣的解决方案是个好问题。

您的问题标记为libgdx,所以我的解决方案不会不使用它。让我们在这里讨论每一个问题。

不管怎么说,它仍然是漂浮的

首先,我需要告诉您,无论您有多精确的位置(浮动,双),libgdx的底层系统最终都将与float一起使用。请参见它的SpriteBatch类,它在需要在屏幕上绘制某些东西时使用float来表示位置,还可以看到Sprite类,它的位置以float为基础。

这意味着,无论您的精度,事情将被画在屏幕上的float

精度

而且,无论您使用float还是double,您都会得到浮点计算错误。如果你不能离开一点点(我不太清楚你的游戏需求),不管是关于位置还是其他什么根据你的游戏,那么你可能需要考虑使用BigDecimal。银行应用程序会使用这样的东西,因为它不会因为四舍五入的错误而失去任何一点,客户可能会抱怨!

您可以通过在您的游戏对象中维护BigDecimal而逃脱。您可以通过它们更新它的位置,而不是通常在libgdx中设置位置的方式。但是,无论何时您需要绘图,您都可以通过doubleValue()获得它的值。为什么双倍不浮?最好是获得最高的精度,它可以提供给您的游戏使用,所以当浮点数不能100%准确地表示数字,你将得到最小的错误尽可能少。

BigDecimal慢

要小心,因为BigDecimal比正常的浮点操作慢.参见它的基准测试这里这里

解决办法

因为我在某个时间点看到,用户在您的空间中只看到有限的区域。或者,即使你有一个空间地图,允许用户放大来查看整个区域,在这个时候,你真的不需要精确性或者使用double-precision,默认的方式libgdx就足够了,也不需要切换游戏库(其他游戏库也主要是基于float的)。

这就是为什么您仍然可以使用float,但使用BigDecimal或仅使用String来表示屏幕上任何大的科学值,而不涉及影响运行时游戏性能的计算。因此,我相信这可以让我们缩小巨大的距离,这样你就可以用同样的意图来表达游戏对象的科学正确性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45990991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档