使用android NDK获取硬件浮点数

Goz*_*Goz 13 c++ android android-ndk armv7 android-ndk-r4

我已经开始玩Android NDK了.我刚刚学到的一件事是创建一个application.mk文件来指定armv7 abi.

我正在使用以下参数构建san-angeles示例.

APP_MODULES      := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM        := release
APP_ABI          := armeabi-v7a
Run Code Online (Sandbox Code Playgroud)

然而,这似乎以与之前完全相同的速度运行(即严重).我只是GL限制而不是CPU限制或这里有什么问题吗?

我注意到在编译时我发出了以下命令行选项:

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 
Run Code Online (Sandbox Code Playgroud)

令我担心的是"softfp".有提到v7 abi,​​VFP fpu的东西,我猜"拇指"指的是"拇指-2"指令(虽然我不知道究竟是什么).然而,"softfp"确实与我有关.难道不应该是"hardfp"吗?

有人对这些问题有任何想法吗?我想我可能已经准备好开始为我的HTC Desire实现一些GL ES 2.0代码,但我想确保我从中获得最佳速度:)

提前干杯!

fad*_*den 32

您提供给NDK的选项只会影响代码的编译方式.它不会更改GL库或平台的任何其他内容,它们总是以适当的方式生成.如果您只是在GL硬件上抛出几何体,那么您将不会看到差异.

如果您想查看您的选项是否有效,请下载(或创建)一个简单的基准测试,该基准测试使用双精度浮点值执行大量操作,并计算执行前后所需的时间.

-mfloat-abi = softp参数确定如何在函数之间传递浮点值.softfp意味着它们总是在整数寄存器或堆栈中传递.如果Android没有指定softfp,那么该库的ARMv7-A版本会期望浮动显示在硬件寄存器中,并且为ARMv5TE构建的任何代码都会中断.

"softfp"为某些函数增加了一点开销,但是在fp寄存器中移入和移出值的指令在ARM上很便宜,并且提供的ABI兼容性使其值得.

"-mthumb"可以生成Thumb/Thumb2代码.Thumb代码往往有点慢,但比同等的ARM小一点; 有时候更小意味着你可以更好地适应CPU i-cache并且实际上运行得更快.大小始终是这些设备的关注点,因此默认情况下启用Thumb.

如有疑问,"arm-eabi-objdump -d whatever.o"将向您显示代码的反汇编.

更新: NDK r9b添加了对-mhard-float的支持.这允许您使用armeabi-v7a目标的硬浮点API约定构建NDK库.