2011-03-02 7 views
7

En mi fondo de pantalla en vivo, estoy dibujando 3 cuadrículas con textura que cubren toda la pantalla. En Nexus One obtengo 40 fps. Estoy buscando formas de mejorar el rendimiento.Consejos para mejorar la tasa de relleno de OpenGL ES en Android

Los cuádriceps se mezclan uno encima del otro, las texturas se cargan desde RGB_8888 bitmaps. Las texturas son 1024x1024.

Tengo

glDisable(GL_DITHER); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); 
glDisable(GL10.GL_LIGHTING); 
glDisable(GL_DEPTH_TEST); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

cosas que he intentado, todo lo cual resulta en los mismos 40fps:

  • Reducir tamaño de textura de 512x512 y 256x256
  • extensión Uso draw_texture
  • Inhabilite la combinación
  • Cambie el filtrado de texturas de GL_LINEAR a GL_NEAREST
  • Uso OISCIV (desesperado intento, ya que hay sólo 3 quads ...)
  • ejecutar el código de dibujo en la actividad autónoma (en caso de ser un fondo de pantalla en vivo de alguna manera afecta el rendimiento)

Si dibujo 2 capas en lugar de 3, fps se eleva a 45 o así, y luego dibujar solo 1 capa ve que los fps suben a 55. Supongo que estoy limitado por la tasa de relleno, ya que apagar y encender las características potencialmente costosas resulta en el mismo fps, y lo único que parece mejorar los fps es simplemente dibujar menos ...

Estoy reflexionando sobre la idea de la compresión de texturas, pero soportando los diferentes formatos de compresión no parecen divertidos. ETC1 no tiene un canal alfa que yo necesite, y no estoy seguro si PVRTC y ATITC pueden usarse incluso desde Java y OpenGL ES 1.0 o 1.1.

Estaría encantado de escuchar ideas sobre qué más probar. Puedo dar un puntero a la versión actual del fondo de pantalla y capturas de pantalla si eso es útil.

Respuesta

4

Es probable que ya pensado en esto, pero por si acaso no lo hizo:

  • llamando glClear en el inicio de su marco, probablemente, no es necesario
  • que podría hacer la primera pasada con la mezcla deshabilitado

Además, ¿intentó hacerlo en 1 pasada con un enfoque de texturización múltiple?

editar: Y otra cosa: no es necesario escribir en el z-buffer, así que use un contexto sin z-buffer, o deshabilite la escritura de profundidad con glDepthMask(GL_FALSE).

+0

borrar vs no borrar fotograma con glClear no afecta a fps para mí. Tampoco habilita/deshabilita la mezcla. Veré texturas múltiples, ¡gracias! –

+8

OpenGL ES en mosaico Las GPU a menudo confían en que glClear se invoque como una sugerencia de que debe evitar volver a cargar el framebuffer en la memoria de mosaico antes de renderizar. Si no borras el framebuffer al comienzo de tu fotograma, esto puede afectar seriamente el rendimiento de dichos dispositivos, así que si no tienes una buena razón para dejar el glClear, es mejor dejarlo. – moonshadow

3

glCompressedTexImage2D está disponible en Java (y NDK), sin embargo, el formato de compresión disponible depende de la GPU.

The AndroidManifest.xml File > supports-gl-texture

  • PowerVR SGX - Nexus S, Galaxy S/Tab, DROID - PVRTC
  • Adreno - Nexus One, EVO - ATITC
  • Tegra2 - Xoom, Atrix - S3TC

Si usa este formato de compresión y desea admitir varios dispositivos Android, debe prepararse para muchas texturas comprimidas, pero la textura de compresión nativa de la GPU debería mejorar el rendimiento de la representación.

+0

¡Intentará probar texturas comprimidas, gracias! –

+0

Hice una prueba rápida con ETC1. No alfa, pero está bien, solo quiero ver si el uso de texturas comprimidas mejora la tasa de relleno. Parece que no: al dibujar tres quads de pantalla completa uno encima del otro se obtienen los mismos 40fps. Supongo que esto es una limitación de rendimiento de la GPU de N1 que no puedo hacer mucho al respecto ... –

+0

¿Qué tal ATITC en lugar de ETC1? [MOTODEV - Comprender la compresión de texturas] (http://developer.motorola.com/docstools/library/understanding-texture-compression/) En lo que respecta a mi experiencia, el uso de PVRTC mejora el rendimiento de representación con PowerVR SGX. –

1

El androide min3d marco OpenGL es capaz de dibujar estos objetos o escenas en un 60 fps completos.

El marco es de código abierto y está disponible para su descarga y uso en: http://code.google.com/p/min3d/

Yo recomendaría la comparación de su código, para ver lo que ha hecho mal/diferente con el fin de mejorar su rendimiento.

Cuestiones relacionadas