2010-06-09 4 views
13

android NDK로 게임을 시작했습니다. 방금 배웠던 것 중 하나는 application.mk 파일을 만들어 armv7 abi를 지정하는 것입니다.android NDK로 하드웨어 부동 소수점 가져 오기

다음 매개 변수를 사용하여 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 욕망을위한 GL ES 2.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 라이브러리를 작성할 수 있습니다.

+1

죄송합니다. 귀하가이 질문에 답한 사실을 놓쳐 버렸을 것입니다. 좋은 답변 :) – Goz