我已经开始玩Android NDK了。我刚刚学到的一件事是创建一个application.mk文件来指定armv7 abi。
我正在使用以下参数构建san-angeles示例。
APP_MODULES := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM := release
APP_ABI := armeabi-v7a
然而,这似乎与之前的速度完全相同(即严重)。我只是GL限制而不是CPU限制或在这里有问题吗?
我注意到编译时我发出了以下命令行选项:
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb
令我担心的是“softfp”。有提到v7 abi,VFP fpu的东西,我猜“拇指”指的是“拇指-2”指令(虽然我不知道究竟是什么)。然而,“softfp”确实与我有关。难道不应该是“hardfp”吗?
有人对这些问题有任何想法吗?我想我可能已准备好开始为我的HTC Desire实现一些GL ES 2.0代码,但我想确保我能从中获得最佳速度:)
提前干杯!
答案 0 :(得分: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库。