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).

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.)

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 ().

  • Señal fatal 11 (SIGSEGV) código = 2 en genymotion emulador no utilizando NDK
  • Cómo utilizar GraphicBuffer en android ndk
  • Enlazador de Android: referencia indefinida a bsd_signal
  • Actualizar una biblioteca nativa no funciona en Android
  • ¿Es posible reiniciar el teléfono con Android SDK o NDK?
  • FindClass no puede encontrar la clase Java personalizada
  • Depuración de Android ndk-gdb
  • React-Native + Android, solo para arquitectura armeabi
  • ¿Podemos volver a escribir la API de MediaCodec en C?
  • ¿Cuál es la diferencia entre la cadena de herramientas ndk r9 legacy de android y android ndk r9 en windows 64
  • Compila y utiliza impulso para Android NDK R10e
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.