2010-08-02 16 views
8

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 coma flotante de hardware, por lo que creo que cualquier carga pesada con flotadores sería notablemente más lenta.Punto flotante o punto fijo para aplicaciones Android NDK OpenGL?

Sin embargo, estoy planeando preparar todos los datos en su mayor parte (es decir, tener búferes de vértices donde corresponda y transformar usando matrices que no cambian mucho), así que estoy comprimiendo datos en la garganta de OpenGL. ¿Puedo suponer que esto va más o menos directo a la GPU y, como tal, será razonablemente rápido? (Por cierto, el requisito mínimo es OpenGL ES 2.0, por lo que presumiblemente excluye teléfonos antiguos basados ​​en 1.x)

Además, ¿cómo es la penalización cuando mezclo y combino ints y flotadores? Asumiendo que toda mi geometría son solo buffers flotantes preconstruidos, pero utilizo ints para matrices ya que requieren operaciones costosas como las multiplicaciones de matrices, ¿con qué ira incurriré aquí?

Por cierto, sé que debo mantener mis expectativas bajas (parece que pedir flotadores en la CPU es pedir demasiado), pero ¿hay algo remotamente como los registros de VMX de 128 bits?

(Y estoy esperando secretamente que fadden está leyendo esta pregunta y tiene una respuesta impresionante.)

Respuesta

14

mayores dispositivos Android como el G1 y myTouch he CPU ARMv6 sin el apoyo flotante punto. La mayoría de los dispositivos más nuevos, como Droid, Nexus One e Incredible, usan CPU ARMv7-A que sí tienen hardware de FP. Si su juego es realmente intensivo en 3D, podría exigir más de la implementación en 3D que el que los dispositivos anteriores pueden proporcionar de todos modos, por lo que debe decidir qué nivel de hardware desea admitir.

Si codifica exclusivamente en Java, su aplicación aprovechará el hardware de FP cuando esté disponible. Si escribe código nativo con el NDK y selecciona la arquitectura armv5te, no obtendrá hardware FP en absoluto. Si selecciona la arquitectura de armv7-a, lo hará, pero su aplicación no estará disponible en los dispositivos anteriores a ARMv7-A.

OpenGL de Java debería estar encima de los buffers de bytes "directos" ahora, que actualmente tienen acceso lento desde Java pero muy rápido desde el lado nativo. (No sé mucho acerca de la implementación de GL, así que no puedo ofrecer mucho más que eso.)

Algunos dispositivos también son compatibles con la extensión NEON "Advanced SIMD", que ofrece algunas características sofisticadas más allá de lo básico El soporte de VFP tiene. Sin embargo, debe probar esto en tiempo de ejecución si desea usarlo (parece que hay un código de muestra para esto ahora; consulte el NDK page para NDK r4b).

Una respuesta anterior tiene algunos indicadores info about the gcc utilizados por el NDK para fp "duro".

En última instancia, la respuesta a "fijo o flotante" se reduce a qué clase de dispositivos desea que se ejecute su aplicación. Ciertamente es más fácil codificar para armv7-a, pero te desconectas de una parte del mercado.

+1

Sabía que fadden tenía la respuesta a esto. Desearía poder votar más de una vez :) Ya me estoy restringiendo a OpenGL ES 2.0 para poder escribir vertebrados y fragmentar sombreadores, así que supongo que puedo ir hasta el final y requerir ARMv7 (que probablemente va de la mano) mano). Prefiero atraer a más personas de una base de usuarios más pequeña con una aplicación de gran apariencia que arrojar algo de basura a las masas. En su mayoría, ya dejaron de hacer juegos para la PlayStation 1 también. – EboMike

+1

Luego, debe ir a flotar en ARMv7. No va de la mano con OpenGL ES 2.0, pero está cerca de – ognian

+0

Parece que la mayoría de los teléfonos nuevos tienen OpenGL ES 2.0. Sin embargo, analicé los puntajes de referencia, como el índice de referencia AnTuTu, y encontré que muchos de los modelos de menor precio no tienen FPU. –

5

En mi opinión, debe mantener el punto fijo tanto como sea posible.

No solo los teléfonos antiguos faltan soporte de coma flotante, sino también otros nuevos como el HTC Wildfire.

Además, si elige requerir ARMv7, tenga en cuenta que, por ejemplo, el Motorola Milestone (Droid para Europa) cuenta con una CPU ARMv7, pero debido a la forma en que se ha construido Android 2.1 para este dispositivo, utilice sus libs armeabi-v7a (y podría ocultar su aplicación del mercado).

personalmente trabajó en torno a esta detectando apoyo ARMv7 utilizando el nuevo cpufeatures library provisto con NDK R4b, para cargar algunos lib armeabi-v7a bajo demanda con dlopen().

Cuestiones relacionadas