2009-12-04 16 views
9

Estoy trabajando en una aplicación de iPhone que se basa en gran medida en OpenGL. En este momento funciona un poco lento en el iPhone 3G, pero parece ágil en el nuevo 32G iPod Touch. Supongo que esto está relacionado con el hardware. De todos modos, quiero que el rendimiento del iPhone se parezca al rendimiento del iPod Touch. Creo que estoy haciendo muchas cosas de manera subóptima en OpenGL y me gustaría obtener consejos sobre las mejoras que me darán más por el dinero.Consejos sobre la aceleración de OpenGL ES 1.1 en el iPhone

Mi escena de representación va algo como esto:

  • Repetir 35 veces
    • glPushMatrix
    • glLoadIdentity
    • glTranslate
    • Repetir 7 veces
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays (GL_TRIANGLES, ...)
    • glPopMatrix

Mi Vertex, Normal y textura Coords ya están intercaladas.

Entonces, ¿qué pasos debo tomar para acelerar esto? ¿Qué paso probarías primero?

Mi primer pensamiento es eliminar todas esas llamadas a glBindTexture() utilizando un Atlas de texturas.

¿Qué pasa con algunas operaciones de matriz más eficientes? Entiendo que las versiones gl *() no son demasiado eficientes.

¿Qué hay de las VBO?

actualización

Hay 8260 triángulos. Los tamaños de textura son 64x64 png. Hay 58 texturas diferentes.

No he ejecutado instrumentos.

Actualización 2

Después de ejecutar el ES Instrumento de OpenGL en el iPhone 3G encontré que mi solador Utilización estará en el rango de 90-100%, y mi Render La utilización es del orden de 30%.

Actualización 3

textura Atlasing no tenían ningún efecto notable sobre el problema. Los rangos de utilización siguen siendo los indicados anteriormente.

Actualización 4

conversión de mis punteros Vertex y normal a GL_SHORT parecía mejorar FPS, pero la utilización del solador todavía está en el rango de 90% de una gran parte del tiempo. Todavía estoy usando GL_FLOAT para mis coordenadas de textura. Supongo que podría derribarlos en GL_SHORT y guardar cuatro bytes más por vértice.

actualización 5

la conversión de mi coordenadas de textura a GL_SHORT produjo otro aumento del rendimiento. Ahora obtengo sistemáticamente> 30 FPS. La utilización de Solador sigue siendo alrededor del 90%, pero con frecuencia cae en el rango del 70-80%. La utilización de Renderer ronda el 50%. Supongo que esto podría tener algo que ver con escalar las coordenadas de textura del modo de matriz GL_TEXTURE.

Todavía estoy buscando mejoras adicionales. Me gustaría acercarme a 40 FPS, ya que eso es lo que obtiene mi iPod Touch y es muy suave allí. Si alguien todavía está prestando atención, ¿qué otra fruta barata puedo elegir?

+0

¿cuántos triángulos tiene? ¿Qué tan grandes son tus texturas? la primera pregunta sería si está alcanzando límites basados ​​en la cantidad de geometría, el número de píxeles que está procesando o la CPU del host. ¿Has probado usar Instruments para perfilar la CPU o GPU? –

+0

Sí, 32 bits. ¿Cómo se puede ir a RGB565? Usé GIMP para crear mi atlas de textura, si eso hace la diferencia. –

+0

ver la respuesta nueva a continuación acerca de RGB565 y PVRTC –

Respuesta

7

Con una utilización de la persiana aún por encima del 90%, es probable que aún esté vinculado al rendimiento de los vertex. La utilización de su procesador es más alta porque la GPU está renderizando más cuadros. Si su objetivo principal es mejorar el rendimiento en dispositivos más antiguos, la clave sigue siendo reducir la cantidad de datos de vértice necesarios por triángulo. Hay dos lados a esto:

La reducción de la cantidad de datos por vértice: Ahora que todos sus atributos de vértices ya están GL_SHORT s, el siguiente paso a seguir es encontrar una manera de hacer lo que desee con menos atributos o componentes Por ejemplo, si puede vivir sin reflejos espectrales, usar iluminación DOT3 en lugar de iluminación de función fija OpenGL ES reemplazaría sus 3 cortos (+ 1 corto de relleno) para normales con 2 cortos para una coordenada de textura extra. Como bonificación adicional, podrás iluminar tus modelos por píxel.

Reducción del número de vértices necesarios por triángulo: Al dibujar con triángulos indexados, debe asegurarse de que sus índices estén ordenados para una reutilización máxima. Ejecutar su geometría a través de la herramienta PVRTTriStrip de Imagination Technologies sería probablemente su mejor opción aquí.

+0

¿Qué es la iluminación DOT3? Tengo problemas para encontrar una definición decente. –

+0

He decidido marcar esto como la mejor respuesta porque llega al meollo del problema: el tamaño de los datos se ha reducido a OpenGL. –

2

Lo primero que haría es ejecutar perfiles de instrumentos en el dispositivo de hardware que es lento. Debería mostrarle rápidamente dónde están los cuellos de botella para su caso particular.

Update después de los resultados de instrumentos:

This question tiene un resultado similar con instrumentos a los que, tal vez el consejo es también aplicable en su caso (reduciendo básicamente número de datos de vértice)

+0

Sí, lo vi después de jugar con Instruments y tratar de entender lo que me decía. Voy a intentar el consejo relevante, una vez que descubra qué consejo es relevante. –

+0

Esa discusión es bastante pesada :) Al menos tienes un camino por recorrer. – justinlatimer

+0

Sí, yo también lo pensé. Estoy usando GL_FLOAT. Voy a intentar mover algunos de los atributos de vértice a GL_SHORT o GL_BYTE. –

4

Si sólo tiene 58 64x64 diferente texturas, un atlas de textura parece una buena idea, ya que todos encajarían en una sola textura de 512x512 ... si no dependes de los modos de ajuste de texturas, al menos probaría esto.

¿En qué formato están sus texturas? Puede intentar usar una textura comprimida de PVRTC; Creo que eso es menos carga en el Tiler, y me ha sorprendido gratamente la calidad de imagen incluso para texturas de 2 bits por píxel. (Bueno para imágenes naturales, no es bueno si estás haciendo algo que parece un videojuego de 8 bits)

+0

Son pngs. No confío en los modos de ajuste de texturas. –

+0

@Rob Jones: quiso decir qué formato están almacenados en VRAM no en disco. 'GL_RGB',' GL_RGBA', 'GL_LUMINANE_ALPHA', etc. –

1

¿Has revisado la "Guía de programación de OpenGL ES para iPhone OS" en el centro de desarrollo? Hay secciones sobre Mejores prácticas para datos de vértices y datos de textura.

¿Están formateados sus datos para poder usar bandas triangulares?

En términos de menor esfuerzo, la secuencia de modificación para que probablemente sería:

  • Reducir vértice atributo de tamaño
  • OISCIV

Tenga en cuenta que cuando se hace esto, es necesario hacer Asegúrese de que los componentes estén alineados en su alineación original, es decir, los flotantes o las entradas completas están en límites de 4 bytes, los cortos están en límites de 2 bytes. Si no haces esto, tu rendimiento se verá disminuido. Podría ser útil mapearlo mentalmente escribiendo el orden de los atributos como una definición de estructura para que pueda verificar su diseño y alineación.

  • asegurándose de que sus datos es despojado de compartir vértices
  • usando una textura atlas para reducir permutas textura
+0

Sí, he leído el documento. –

2

La victoria más importante en la programación de gráficos se reduce a esto:

por lotes, por lotes , Lote

TextureAtlasing hará una gran diferencia que cualquier otra cosa que pueda hacer. Cambiar las texturas es como detener un tren a alta velocidad para dejar entrar a nuevos pasajeros todo el tiempo.

Combina todas esas texturas en un atlas y reduce mucho tus llamadas al sorteo.

Esta herramienta basada en la web puede ser útil: http://zwoptex.zwopple.com/

1

Para tratar de convertir a formato texturas RGB565 de 16 bits, ver este código en Texture2D.m venerable de Apple, búsqueda de kTexture2DPixelFormat_RGB565

http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m

(este código carga PNG y los convierte en RGB565 durante la creación de la textura; no sé si hay un formato de archivo RGB565 como tal)

para obtener más información sobre P texturas comprimidas VRTC (que parecía mucho mejor de lo que esperaba cuando he usado, incluso a los 2 bits por píxel) Ver muestra PVRTextureLoader de Apple:

http://developer.apple.com/iPhone/library/samplecode/PVRTextureLoader/index.html

que tiene tanto el código para texturas carga PVRTC en su aplicación y también instrucciones para usar la herramienta textureTool para convertir sus archivos .png en archivos .pvr.

+0

Esto parece útil. ¡Gracias! –

+0

Parece que esto no ha afectado a mi FPS, pero ha reducido la huella de memoria a menos de medio meg. Gracias por los consejos. Todavía puedo mirar a PVRTC. –

Cuestiones relacionadas