2010-01-15 5 views
9

Estoy tratando de exprimir algunos aumentos de rendimiento de mi aplicación iPhone OpenGL ES. Según Instruments, la utilización de mi soplete está cerca del 100% la mayor parte del tiempo, y mi FPS es de aproximadamente 24. Me gustaría subir mi FPS a más de 30. Puedo obtenerlo convirtiendo de GL_FLOAT a GL_SHORT, pero eso presenta algunos problemas técnicos bastante desalentadores para mí en este momento. Prefiero no ir allí.¿GlDrawElements() es más eficiente que glDrawArrays() cuando hay muchos vértices duplicados?

Por lo tanto, estoy considerando cambiar de glDrawArrays() a glDrawElements(). Tengo 35 mallas formadas por 708 vértices, pero muchos de esos vértices se comparten entre las caras. Estoy mapeando la textura, pero la malla es principalmente de color uniforme. Las caras que requieren texturización especial se dejarán como están.

Digamos que puedo reducir el número de vértices a la mitad. Digamos también que también organizo mi geometría de una manera que tiene sentido para el iPhone: por ejemplo, usando la herramienta PVRTTriStrip de Imagination Technologies. Haciendo caso omiso de la pequeña cantidad de memoria extra para el conjunto de índices, eso significa que reduje aproximadamente el ancho de banda de la memoria a la mitad, por lo que debería ver un aumento bastante bueno en el rendimiento.

¿Es esto cierto, o me falta algo o estoy malentendiendo algo? El consejo es apreciado.

Respuesta

17

En caso de que alguien esté interesado, seguí adelante y probé esto, sin la porción de la herramienta PVRTTriStrip. Todas las pruebas se realizaron en un iPhone 3G. Pude escalar mis vértices de 708 a 113. Y como tengo menos de 255, estoy usando GLubyte como mi tipo de índice. Así, pasé de:

35 * (708 * 32) = ~ 774K

Para:

35 * (113 * 32 + 708 * 1) = ~ 148K

que redujo mi ancho de banda de memoria total por debajo del 20% de lo que era. Mi FPS aumentó a ~ 34. Entonces, vi una mejora del 42% en FPS. En general, estoy bastante feliz. Creo que hay más por ganar, pero ahora tengo peces más grandes para freír.

Además, filtré un montón de triángulos degenerados (no del tipo útil) para obtener mi índice de cuenta regresiva a 522, de 708. A partir de eso vi un aumento a ~ 40 FPS de los ~ 34 FPS que estaba viendo .

1

Si está utilizando una utilización de Solado de 100% en instrumentos (like I was), está siendo limitado por el tamaño de su geometría. De todas las cosas que traté de mejorar el rendimiento, solo noté un aumento significativo en la velocidad de fotogramas cuando reduje el tamaño de la geometría. Entonces, sí, si puedes eliminar algunos vértices de los que se envían, deberías ver un aumento en el rendimiento.

Aunque diga que es difícil de hacer, recomiendo convertir GL_FLOAT a GL_SHORTs, ya que verá un gran salto en la velocidad de renderizado. Hice esto en mi aplicación, y no fue demasiado complicado implementarlo por el tipo de devolución que obtuve.

+0

Oh, estoy totalmente de acuerdo contigo. De hecho lo tenía funcionando en un punto, pero luego comencé a implementar algunas características nuevas, y la conversión GL_SHORT me estaba causando problemas. Me retracté para avanzar en la nueva característica; luego, cuando volví a agregarlo, encontré una nueva capa de complejidad. Definitivamente será lo próximo que intentaré si encuentro que necesito exprimir más rendimiento. –

Cuestiones relacionadas