2010-08-02 2 views
8

내 응용 프로그램 (대부분 C++)에서 3D 관련 요소에 대해 주로 float 또는 int를 사용할지 여부를 결정하려고합니다. 대부분의 ARM 기반 장치에는 하드웨어 부동 소수점 지원이 없다는 것을 이해합니다. 따라서 부동 소수점을 사용한 무거운 리프트는 눈에 띄게 느립니다.Android NDK OpenGL 앱의 부동 소수점 또는 고정 소수점?

그러나 대부분의 경우 모든 데이터를 준비해야합니다 (적용 할 수있는 경우 꼭지점 버퍼를 사용하고 많은 변경하지 않는 행렬을 사용하여 변환). 따라서 OpenGL의 목구멍에 데이터를 채우고 있습니다. 이것이 GPU에 다소 이상하다고 생각할 수 있습니까? (Btw, 최소 요구 사항은 OpenGL ES 2.0이므로 이전의 1.x 기반 전화기는 제외 할 수 있습니다.)

또한 int와 float을 섞어서 일치시킬 때 패널티는 어떻게됩니까? 내 모든 지오메트리가 단지 미리 빌드 된 플로트 버퍼라고 가정하지만 매트릭스 곱셈과 같은 값 비싼 연산이 필요하기 때문에 매트릭스에 int를 사용합니다. 여기에 얼마나 많은 분노가 생길까요?

덧붙여서, 나는 기대치를 낮게 유지해야한다는 것을 알고 있습니다. (CPU의 부동 소수점을 요구하는 소리가 너무 많습니다.) 128 비트 VMX 레지스터 같은 것이 있습니까?

(그리고 비밀리에 fadden이 질문을 읽고 멋진 대답을 가지고 것을 바라고 있어요.)이 G1과 MyTouch의 같은

답변

14

이전 안드로이드 장치는 한 부동 소수점 지원없이 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 page 참조).

이전 대답에는 NDK에서 "하드"fp로 사용하는 일부 info about the gcc 플래그가 있습니다.

궁극적으로 "고정 또는 부동"에 대한 대답은 앱을 실행할 기기의 종류에 달려 있습니다. 확실히 armv7-a를 코딩하는 것이 더 쉽지만, 시장의 일부분에서 벗어나게됩니다.

+1

나는 우경에 이것에 대한 답이 있음을 알았다. 내가 두 번 이상 투표 할 수 있기를 바란다. 이미 OpenGL ES 2.0으로 제한하고 있으므로 정점 및 조각 쉐이더를 작성할 수 있으므로 모든 방향으로 갈 수 있으며 ARMv7이 필요할 수도있다. 손). 차라리 대중에게 쓰레기를 던지기보다는 멋진 사용자로 더 많은 사용자를 끌어 들이고 싶습니다. 그들은 대부분 PlayStation 1 용 게임 제작을 대부분 중단했습니다. – EboMike

+1

ARMv7에서 float을 수행해야합니다. OpenGL ES 2.0과는 관련이 없지만 가깝습니다. – ognian

+0

대부분의 새 휴대폰에는 OpenGL ES 2.0이있는 것으로 보입니다. 그러나 AnTuTu 벤치 마크와 같은 벤치 마크 점수를 살펴보면 저렴한 가격의 많은 모델이 FPU가없는 것으로 나타났습니다. –

5

제 생각에는 가능한 한 고정 소수점을 사용해야합니다.

휴대 전화뿐만 아니라 부동 소수점 지원 기능을 잃어 버렸을뿐만 아니라 HTC Wildfire와 같은 새로운 기능도 지원합니다.

또한 ARMv7을 요구하는 경우 Motorola Milestone (Droid for Europe)은 ARMv7 CPU를 갖추고 있지만 Android 2.1이이 장치 용으로 구축 된 방식 때문에 장치가 armeabi-v7a 라이브러리를 사용하십시오 (또한 Market에서 앱을 숨길 수도 있습니다).

NDK r4b와 함께 제공되는 새로운 cpufeatures library을 사용하여 ARMv7 지원을 감지하여 개인적으로 dlopen()을 사용하여 armeabi-v7a lib를로드합니다.