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

Ebo*_*ike 8 android opengl-es android-ndk

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

但是,我计划大部分准备所有数据(即在适用的地方使用顶点缓冲区并使用不会发生很大变化的矩阵进行变换),所以我只是将数据填入OpenGL的喉咙.我可以假设这或多或少直接到GPU并且因此会相当快吗?(顺便说一句,最低要求是OpenGL ES 2.0,因此大概不包括基于1.x的旧手机.)

另外 - 当我混合和匹配整数和浮动时,惩罚如何?假设我的所有几何都只是预先构建的浮点缓冲区,但是我使用整数作为矩阵,因为那些需要昂贵的操作,比如矩阵乘法,我会在这里产生多少愤怒?

顺便说一句,我知道我应该保持低预期(听起来甚至要求CPU上的浮动要求太多),但有没有像128位VMX寄存器那样远程?

(我暗暗希望fadden正在阅读这个问题并且有一个很棒的答案.)

fad*_*den 14

较老的Android设备(如G1和MyTouch)具有ARMv6 CPU,没有浮点支持.大多数较新的设备,如Droid,Nexus One和Incredible,都使用具有FP硬件的ARMv7-A CPU.如果您的游戏真的是3D密集型的,那么3D实现可能需要的数量比旧设备所能提供的要多,因此您需要决定要支持的硬件级别.

如果您只使用Java编写代码,那么您的应用程序将在可用时利用FP硬件.如果使用NDK编写本机代码,并选择armv5te体系结构,则根本不会获得硬件FP.如果您选择armv7-a架构,您将会在ARMv7-A之前的设备上使用您的应用程序.

Java中的OpenGL现在应该位于"直接"字节缓冲区之上,目前从Java访问速度很慢,但从本机端访问速度非常快.(虽然我对GL实现了解不多,所以我不能提供更多.)

有些设备还支持NEON"高级SIMD"扩展,它提供了一些超出基本VFP支持的功能.但是,如果要使用它,则必须在运行时对此进行测试(现在看起来就像这样的示例代码 - 请参阅NDK r4b 的NDK页面).

前面的答案有一些关于 NDK用于"硬"fp 的gcc标志的信息.

最终,"固定或浮动"的答案归结为您希望应用程序在哪种类型的设备上运行.为armv7-a编码当然更容易,但是你将自己从市场中分离出来.


oli*_*erg 5

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

不仅旧手机不支持浮点支持,还有HTC Wildfire等新手机.

此外,如果您选择要求ARMv7,请注意,例如摩托罗拉Milestone(Droid for Europe)确实具有ARMv7 CPU,但由于Android 2.1已为此设备构建,因此该设备不会使用您的armeabi- v7a libs(可能会将您的应用程序隐藏在市场中).

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