在Android NDK OpenGL应用程序中,浮点数或定点数哪个更好?

8
我正在考虑在我的应用程序中(主要使用 C++)是否应该主要使用浮点数或整数来处理所有3D相关元素。我了解到大多数基于 ARM 的设备没有硬件浮点支持,因此我认为使用浮点进行任何复杂计算都会明显变慢。
但是,我打算准备好绝大部分数据(例如有适用的顶点缓冲并使用不常更改的矩阵进行转换),所以我只是将数据传递给 OpenGL。我能否假设这些数据直接传递到 GPU 并且因此速度合理快呢? (顺便说一句,最低要求是 OpenGL ES 2.0,因此这可能排除了旧的基于 1.x 的手机。)
同时,如果我混合使用整数和浮点数,会有什么影响呢?如果所有的几何体都是预先构建的浮点数缓冲区,但我对于需要执行昂贵操作(如矩阵乘法)的矩阵使用整数,那么我会遇到多少问题?
另外,我知道我应该保持期望值低(似乎即使在 CPU 上请求浮点数也太过分了),但是否有类似于 128 位 VMX 寄存器之类的东西存在呢?
(顺便说一句,我希望fadden能够看到这个问题并给出一个很棒的答案。)
2个回答

14
较旧的Android设备(如G1和MyTouch)具有不支持浮点运算的ARMv6 CPU。大多数更新的设备(如Droid、Nexus One和Incredible)使用具有FP硬件的ARMv7-A CPU。如果您的游戏确实需要更多的3D实现,超出了老设备所能提供的,因此您需要决定要支持哪个级别的硬件。
如果您完全使用Java编写代码,则应用程序将利用可用的FP硬件。如果您使用NDK编写本机代码,并选择armv5te架构,则根本不会获得硬件FP。如果您选择armv7-a架构,则会获得,但是您的应用程序将无法在先前的ARMv7-A设备上使用。
Java中的OpenGL现在应该基于“直接”字节缓冲区,从Java访问目前很慢,但从本机端非常快。 (我不太了解GL实现,所以我不能提供更多信息。)
一些设备还支持NEON“高级SIMD”扩展,它提供了一些比基本VFP支持更高级的功能。但是,如果要使用它,您必须在运行时进行测试(看起来现在有示例代码 - 请参见NDK r4b的NDK页面)。
早期的答案提供了关于NDK用于“hard” fp的gcc标志的一些信息。

最终,“固定还是浮动”取决于您希望应用程序在哪种设备上运行。编写armv7-a的代码肯定更容易,但您会失去一部分市场。


1
我知道Fadden有这个答案。我希望我可以投多次票 :) 我已经限制自己使用OpenGL ES 2.0,以便编写顶点和片段着色器,所以我想我可能也应该要求ARMv7(这可能是相辅相成的)。我宁愿吸引更多小众用户群体的人来使用一个外观漂亮的应用程序,而不是向大众推出一些垃圾。他们现在也基本停止为PlayStation 1制作游戏了。 - EboMike
1
你应该选择在ARMv7上使用浮点数。它与OpenGL ES 2.0不是完全匹配的,但很接近。 - ognian
似乎大部分新手机都配备了OpenGL ES 2.0。但是,我查看了AnTuTu等基准测试分数,发现许多低价型号没有FPU。 - Boris van Schooten

5

我认为在可能的情况下应该坚持使用定点数。

不仅旧手机缺乏浮点支持,新手机(如HTC Wildfire)也是如此。

此外,如果您选择要求ARMv7,请注意例如Motorola Milestone(欧洲版Droid)具有ARMv7 CPU,但由于Android 2.1为此设备构建的方式,该设备将不使用您的armeabi-v7a库(并可能从市场中隐藏您的应用程序)。

我个人通过使用NDK r4b提供的新cpufeatures库检测ARMv7支持,并使用dlopen()按需加载一些armeabi-v7a库来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接