OpenGL ES 2.0: buscando consejos de optimización / rendimiento de VBO para muchos vértices en movimiento

En mi intento continuo de convertir a OpenGL ES 2.0 desde ES 1.x, actualmente estoy convirtiendo algún código para usar Vertex Buffer Objects ('VBOs') en lugar de las llamadas existentes de glDrawArrays sin búfer.

He configurado los VBO y los puse a trabajar, pero he encontrado un dilema de diseño y agradecería el consejo de alguien más experimentado con OpenGL ES 2.0.

Quiero dibujar un montón de sprites poligonales que se mueven con frecuencia. Esto se debe a que son cuerpos dinámicos de Box2D, si está familiarizado con Box2D. Cada uno de estos cuerpos poligonales se genera mediante el uso de GL_TRIANGLE_FAN, que es algo crítico ya que GL_POLYGON no está disponible en ES 2.0.

Los polígonos tienen otros atributos como el color quemay se cambiará en algún momento durante el ciclo de vida de la aplicación, pero se garantiza que las posiciones de los vértices cambien casi todos los cuadros.

Los polígonos se agrupan en el juego, por lo que es mi intención administrar y dibujar una matriz de vértices / colores intercalados por grupo en lugar de por cuerpo, en un intento de minimizar la comunicación de la GPU.

Hay varias rutas para el éxito aquí, he estado leyendoOpenGL ES 2.0 guía de programación para buscar tanta información y consejos de optimización como pueda en relación con los VBO y esto es lo que dicen:

Los datos intercalados son favorables ya que "los datos de atributos para cada vértice se pueden leer de forma secuencial".

El libro recomienda que "si un subconjunto de datos de atributo de vértice necesita ser modificado ... uno puede ... almacenar atributos de vértice que son de naturaleza dinámica en un búfer separado".

La recomendación es "usar GL_HALF_FLOAT_OES siempre que sea posible", especialmente para los colores, ya que las ubicaciones de vértices no proyectadas pueden exceder este requisito de espacio.

glMapBufferOES solo debe usarse si se está actualizando todo el búfer, e incluso en este caso la operación "aún puede ser costoso en comparación con glBufferData".

Aquí estan mis preguntas:

Si utilizo GL_TRIANGLE_FAN como modo de dibujo, ¿esto me obliga a almacenar un VBO por cuerpo en lugar de por grupo? ¿O una ubicación de vértice común para 'finalizar' el ventilador y el cuerpo actual hará que se dibuje un nuevo ventilador para el siguiente cuerpo en un VBO grupal?

Debo intercalar todos mis datos a pesar de que las ubicaciones de los vértices se actualicen a una frecuencia alta, o debería separarlas todas / solo las ubicaciones en su propio VBO?

Siguiendo el consejo del libro anterior, ¿presumiblemente debería glBufferData mis ubicaciones de vértices en su totalidad cada vez que actualizo el renderizado, en lugar de usar glMapBufferOES o glBufferSubData para actualizar las ubicaciones almacenadas?

Existen funciones / opciones de diseño no mencionadas que debería utilizar para mejorar el rendimiento en un contexto de muchos polígonos en movimiento?

¿Debería intentar usar GL_HALF_FLOAT_OES para el almacenamiento de color, es decir, en el espacio de 2 flotadores, en su lugar almaceno 4 números de medio flotador? Si la respuesta es 'sí', ¿usaría cualquier tipo de GL que sea la mitad del tamaño de GLfloat para cada color, luego bit a bit O ellos, y luego inserte en la matriz de atributos adecuada?

Una vez que he creado X muchos VBO, ¿son las únicas llamadas que necesito hacer para cada render glBindBuffer, glBufferData y glDrawElements / Arrays, o también debo llamar a glEnableVertexAttribArray y glVertexAttribPointer cada vez que uso glBufferData?

Estaría extremadamente agradecido por más consejos sobre esto, gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta