2011-06-12 7 views
5

No entiendo por qué este código es lento para la GPU en iOS, este código funciona muy bien en Windows sin ningún problema.glBufferSubData actuaciones abismales en iOS?

Básicamente lo que hago es que tengo un gran búfer de vértices dinámico (GL_STREAM_DRAW) y trato de actualizar solo partes de él, las partes que en un solo cuadro no deben superponerse, por lo que no deberían causar vaciados y la CPU no debería tener que esperar a que termine la GPU, pero claramente no es el caso, recibo aproximadamente 10 fps en un iPhone 4 incluso cuando dibujo tan solo 10 o 20 triángulos ... mientras obtengo más de 400 FPS en mi PC con el mismo código ...

Como puede ver en la traza, estoy reutilizando el mismo buffer, pero me estoy asegurando de que las partes actualizadas no se superpongan ... ¿Qué podría hacer con mejorar el rendimiento?

 
Index Trace 
695 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
696 glBufferSubData(GL_ARRAY_BUFFER, 144l, 144l, 0x0453d090) 
697 glBlendFunc(GL_SRC_ALPHA, GL_ZERO) 
698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
699 glActiveTexture(GL_TEXTURE0) 
700 glBindTexture(GL_TEXTURE_2D, 12u) 
701 glUseProgram(12ul) 
702 glUniform4fv(uniform_000000001cd24950_12_0, 1, {0.0500000f, 0.0000000f, 0.0000000f, 0.0000000f}) 
703 glUniform4fv(uniform_000000001cd24950_12_1, 1, {0.0000000f, 0.0333333f, 0.0000000f, 0.0000000f}) 
704 glUniform4fv(uniform_000000001cd24950_12_2, 1, {0.0000000f, 0.0000000f, -0.0010010f, 0.0000000f}) 
705 glUniform4fv(uniform_000000001cd24950_12_3, 1, {-0.0000000f, 0.6333333f, -0.0010010f, 1.0000000f}) 
706 glDrawArrays(GL_TRIANGLES, 6, 6) 
707 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
708 glBufferSubData(GL_ARRAY_BUFFER, 288l, 144l, 0x0453d120) 
+0

Si eres nuevo aquí, no te olvides de informarte sobre las funciones de aceptación y votación. –

Respuesta

5

supongo que el conductor iOS no es sólo lo suficientemente inteligente, para ver que los rangos actualizados (en glBufferSubData) no se superponen con los actualmente procesados. Ni siquiera estoy seguro de si el controlador de tu PC es lo suficientemente inteligente para eso (podría ser que el rendimiento general de tu PC lo oculte). Depende del conductor cómo se sincroniza y si optimiza eso.

Una solución para manejar esto podría ser la extensión ARB_map_buffer_range, que puede dar pistas explícitas al controlador. Pero no estoy seguro si esto es compatible con ES. De lo contrario, no tendrás que dividir tu memoria intermedia en varias pequeñas.

+1

Sí, esto es lo que finalmente pensé ... es triste cómo OpenGL no funciona tan bien como DirectX para ese tipo de cosas, siempre ha sido un dolor lidiar con los buffers de vértices en OpenGL. La solución que encontré que funcionó en el iPhone fue revertir a matrices de vértices simples (sin VBO) para mis necesidades dinámicas de buffer de vértice. –