对于2D Vector类,是浮点型还是双精度型?


11

我目前正在为我们的工作室编写一个基于OpenGL的跨平台小型2D游戏引擎。当我研究使用哪种2D Vector类时,偶然发现了三种不同的设计范例:

  • 浮动和按价值致电,就像在Gamasutra的这篇文章中一样。似乎速度很快,但精度却很低(另请参见Thread)。专业版:快速,便携式且与大多数库兼容。

  • 双重和按引用致电。如果我正确理解了以上文章,我也可以使用2个双精度变量而不是4个浮点数。根据上述线程double仍然比float慢。

  • double和float的模板:广泛流行的书籍“ Game Engine Architecture ”使用模板,使得可以根据需要使用float和double。明显的缺点是代码膨胀。另外,我怀疑是否可以在基本不编写两个类的情况下优化代码。

我希望了解您在内部引擎中使用的解决方案,以及例如流行游戏引擎的精确度,因此我可以决定在引擎中实施哪种解决方案。目前,我正在考虑仅使用float精度并使用它。


哪里?如果速度与特定的体系结构无关,那么您就无法谈论速度。
o0'。

2
@ Lo'oris:我不知道双倍于浮点数的架构。

与其编写自己的向量类,不如考虑使用Sony的(bulletphysics.org/Bullet/phpBB3/…)。这是一个易于插入的仅标头的“库”,已经进行了微优化,所有矢量库基本上都是相同的外部接口。

@乔:2双打而不是4花车?
o0'。

@ Lo'oris:这个问题的措辞有点怪异,我不知道发问者是否感到困惑或只是您-在处理SIMD时,您使用两个double(而不是四个)float,因为寄存器的宽度为128位。您仍然需要处理相等数量的数字,并且以半速进行处理。

Answers:


9

除非我有理由使用double,否则我总是使用float,除非我有理由使用int64_t,否则我总是使用int。

浮点数可以精确地执行2 2到24的整数运算,这是大多数人(大多是非理性地)所担心的。双精度不能解决通用值无法精确表示的问题-无论您获得0.10000001还是0.10000000000000001,您仍然必须确保您的代码将其视为“等于” 0.09999999。

在您将要编写游戏的每个平台上,双打速度都较慢,占用的内存带宽增加了一倍,并且可用的专用CPU指令更少。

在C / C ++侧和内部着色器上,单精度浮点数仍然是硬件图形接口的标准。

在某个时候您可能需要一个double向量,但是应在需要时使用它,而不是默认情况下。

至于模板-是的,为了获得最佳性能,无论如何都要手动专门化模板。除此之外,我在周末对某些模板代码进行了一些测试(制作了4倍的IntRect和FloatRect),发现模板版本的编译时间比重复代码大约要长20倍,这大约需要15行。重复很糟糕,但是等待编译更糟糕-好像我永远都不需要StringRect或FooRect。


在每个平台上,双打都比较慢[…] ” –需要引用。
天顶

3

Microsoft XNA游戏框架具有使用浮点数的Vector2类。这是我个人选择花车的最大理由,因为我相信XNA团队的智慧和经验要比我自己的要大得多。

我发现阅读这个Stack Overflow问题中的答案非常有趣:“浮动vs双重性能”。还有一个gamedev.net线程,其中讨论了GPU的双重性能。我认为可以肯定地认为,至少在许多GPU中,double的速度要比float慢,而且我个人始终在其double的对等情况下使用float OpenGL函数。如今,这可能并不适用,但是如果您认为并非所有运行游戏的人都具有支持本机双重支持的最新GPU,那么我认为这足以使用float并获得额外的性能。


1
关于SO的问题:“在x86处理器上,至少Float和Double将被FPU转换为10字节实数进行处理。” 虽然这是事实,但它忽略了SIMD指令和两倍的附加内存(=较差的高速缓存一致性,更多的内存带宽)要求,这两者都使其在实际测试中的运行速度比浮动速度慢。

我发现有一个陷阱。您应该在SO答案上发表评论,我会赞成。
莉吉特

它已经在那里作为评论。

1
自从您使用XNA以来,我还应该指出Direct2D也使用单精度浮点数。
Mike Strobel

为了完整起见,OpenGL的方法有float和double版本,因此从这个意义上来说是中立的。
莉吉特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.