Android NDK OpenGL应用的浮点或定点?

我正在决定是否主要在我的应用程序(大部分是C ++)中使用浮点数或整数来表示所有与3D相关的元素。 据我所知,大多数基于ARM的设备都没有硬件浮点支持,所以我认为任何使用浮动的繁重工作都会明显变慢。

不过,我打算准备好大部分数据(即,在适用的地方使用顶点缓冲区,并使用不会改变的matrix进行转换),所以我只是将数据填入OpenGL的喉咙。 我可以假设这或多或less直接对GPU,并且因此会相当快? (顺便说一句,最低要求是OpenGL ES 2.0,所以大概不包括基于旧版本的1.x手机。)

另外 – 当我混合匹配整数和浮点数时,罚分是多less? 假设我所有的几何graphics都是预构build的浮点缓冲区,但是我使用matrix的整数,因为这些操作需要昂贵的操作,比如matrix乘法,那么我会在这里产生多less愤怒?

顺便说一句,我知道我应该保持低的期望(听起来像甚至要求花花公子CPU要求太多),但有什么远程像128位VMX寄存器?

(而且我暗中希望法登正在阅读这个问题,并且有一个很好的答案。

Solutions Collecting From Web of "Android NDK OpenGL应用的浮点或定点?"

较早的Android设备(如G1和MyTouch)具有ARMv6 CPU,无需浮点支持。 大多数较新的设备,如Droid,Nexus One和Incredible,都使用具有FP硬件的ARMv7-A CPU。 如果您的游戏真的是3D密集型游戏,那么3D实现可能需要更多的旧设备,所以您需要确定要支持的硬件级别。

如果您使用Java编码,您的应用程序将在可用时利用FP硬件。 如果你使用NDK编写本地代码,并selectarmv5te体系结构,则根本不会获得硬件FP。 如果您select了armv7-a体系结构,那么您的应用将无法在ARMv7-A之前的设备上使用。

Java的OpenGL现在应该位于“直接”字节缓冲区之上,目前从Java访问速度缓慢,但从本地方面来说速度非常快。 (虽然我不太了解GL的实施,所以我不能提供更多的东西。)

有些设备还支持NEON“高级SIMD”扩展,它提供了超出基本VFP支持的一些奇特function。 然而,如果你想使用它,你必须在运行时testing它(看起来现在有这样的示例代码 – 查看NDK r4b的NDK页面 )。

以前的答案有一些关于 NDK用于“硬”fp 的gcc标志的信息 。

最终,“固定或浮动”的答案归结为你希望你的应用运行在哪一类设备上。 为armv7-a编写代码肯定比较容易,但是你从一个市场上切断了自己。

在我看来,你应该尽可能地坚持定点。

不仅旧手机错过了浮点支持,而且新的,如HTC野火。

此外,如果您select要求ARMv7,请注意,例如摩托罗拉Milestone(Droid for Europe)确实具有ARMv7 CPU,但是由于为此设备构build了Android 2.1,因此该设备不会使用您的armeabi- v7a库(可能会隐藏你的应用程序从市场)。

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