13

我已经开始玩 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 的东西,我猜“thumb”指的是“thumb-2”指令(虽然我不知道这些到底是什么)。然而,“softfp”确实让我担心。不应该是“hardfp”吗?

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

提前干杯!

4

1 回答 1

33

您提供给 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 库。

于 2010-06-11T23:09:46.707 回答