Punto flotante o de punto fijo para Android NDK aplicaciones OpenGL?
Estoy tratando de decidir si utilizar principalmente flotantes o ints para todos los elementos relacionados con 3D en mi aplicación (que es C ++ en su mayor parte). Entiendo que la mayoría de los dispositivos basados en ARM no tienen soporte de punto flotante de hardware, así que imagino que cualquier levantamiento pesado con flotadores sería notablemente más lento.
Sin embargo, estoy planeando prep todos los datos en su mayor parte (es decir, tienen buffers de vértice donde sea aplicable y transformar usando matrices que no cambian mucho), así que estoy sólo relleno de datos por la garganta de OpenGL. ¿Puedo asumir que esto va más o menos directamente a la GPU y como tal será razonablemente rápido? (Btw, el requisito mínimo es OpenGL ES 2.0, por lo que presumiblemente excluye los teléfonos basados en 1.x).
- ¿Las funciones de Android JNI se ejecutan en el hilo principal?
- cómo utilizar ddms para fugas de memoria en código c ++
- SimpleJSON C ++ Class no puede analizar cadenas en Android (NDK) pero la misma clase funciona en cualquier otra plataforma
- ffmpeg para un android (usando el tutorial: "ffmpeg y Android.mk")
- System.loadLibrary (...) no podría encontrar biblioteca nativa en mi caso
También – ¿cómo es la pena cuando me mezclo y juego ints y flotadores? Suponiendo que toda mi geometría es sólo buffers de flotador pre-construidos, pero yo uso ints para matrices ya que requieren operaciones caras como multiplicaciones de matriz, ¿cuánta ira me incurrirá aquí?
Por cierto, sé que debo mantener mis expectativas bajas (suena como siquiera preguntar por los flotadores en la CPU es pedir demasiado), pero ¿hay algo remotamente como registros de 128 bits VMX?
(Y estoy esperando en secreto que Fadden está leyendo esta pregunta y tiene una respuesta impresionante.)
- No se puede escribir en el registro ARM R4: feature o bug?
- Android ndk vs sdk - si las características se refiere
- Construir android con clang en lugar de gcc? Y el clang stl lib en lugar de gnustl lib?
- APK firmado con Android que muestra incompleto
- EGL trabajando en Linux pero no en Android
- Comunicación de voz a una frecuencia de muestreo de 8KHz para todos los dispositivos Android con OpenSL
- Cómo liberar jstring en un bucle correctamente?
- Cómo configurar la vista de contenido de NativeActivity en un componente creado en Java
Los dispositivos Android más antiguos como el G1 y MyTouch tienen CPUs ARMv6 sin soporte de punto flotante. La mayoría de los dispositivos más nuevos, como el Droid, Nexus One e Incredible, utilizan las CPUs ARMv7-A que tienen hardware FP. Si su juego es realmente intensivo en 3D, podría exigir más de la implementación en 3D que los dispositivos antiguos pueden proporcionar de todos modos, por lo que necesita decidir qué nivel de hardware desea soportar.
Si codifica exclusivamente en Java, su aplicación aprovechará el hardware FP cuando esté disponible. Si escribe código nativo con el NDK y selecciona la arquitectura armv5te, no obtendrá FP de hardware en absoluto. Si selecciona la arquitectura armv7-a, lo hará, pero su aplicación no estará disponible en dispositivos pre-ARMv7-A.
OpenGL de Java debe estar sentado encima de los búferes de bytes "directos" ahora, que actualmente son lentos de acceder desde Java pero muy rápidos desde el lado nativo. (No sé mucho sobre la aplicación GL, así que no puedo ofrecer mucho más que eso.)
Algunos dispositivos también admiten la extensión NEON "Advanced SIMD", que proporciona algunas características de lujo más allá de lo que tiene el soporte básico de VFP. Sin embargo, debe probar esto en tiempo de ejecución si desea usarlo (parece que hay código de ejemplo para esto ahora – vea la página NDK para NDK r4b).
Una respuesta anterior tiene algo de información sobre las banderas gcc utilizadas por el NDK para "hard" fp.
En última instancia, la respuesta a "fijo o flotante" se reduce a qué clase de dispositivos desea ejecutar su aplicación. Es ciertamente más fácil codificar para armv7-a, pero usted se cortó apagado de un pedazo del mercado.
En mi opinión usted debe pegarse con punto fijo tanto como sea posible.
No sólo los teléfonos viejos pierden el soporte de punto flotante, sino también nuevos como el HTC Wildfire.
Además, si elige requerir ARMv7, tenga en cuenta que, por ejemplo, Motorola Milestone (Droid para Europa) cuenta con una CPU ARMv7, pero debido a la forma en que se ha desarrollado Android 2.1 para este dispositivo, el dispositivo no utilizará su armeabi- V7a libs (y podría ocultar su aplicación del Market).
Personalmente he trabajado en torno a esto mediante la detección de apoyo ARMv7 utilizando la nueva biblioteca de cpufeatures proporcionada con NDK r4b, para cargar algunos armeabi-v7a lib on demand con dlopen ().