2011-09-14 9 views
6

Estoy escribiendo una aplicación WebGL que genera geometría algorítmicamente. La geometría consistirá en entre 4-150 objetos, cada uno compuesto por entre 16 y 2048 puntos, dibujado como un TRIANGLE_STRIP a través de drawElements. La geometría será la mayoría de los cuadros estáticos, pero tendrá que ser animada en respuesta a la entrada del usuario. En estos marcos, cuando se actualiza la geometría, se pueden agregar o eliminar puntos/tris. Los objetos también deberán agregarse/eliminarse a lo largo de la vida del programa.Asignación eficiente de VBO en WebGL

¿Cuál es la forma más eficiente de asignar/actualizar VBO en este contexto? Estoy bastante seguro de que debería usar DYNAMIC_DRAW y bufferSubData para actualizar cada objeto, pero ¿quiero sobreasignar algunos VBO enormes (asumiendo el peor caso en términos de puntos por objeto) y definir cada objeto como una offset (número de objeto * tamaño máximo por objeto) y luego tiene un montón de memoria VBO no utilizada asignada en el mejor de los casos? ¿O hay otro enfoque que deba probar? ¿O es esto lo suficientemente pequeño en términos de huella de memoria que estoy pensando demasiado?

Respuesta

8

¿Cuál es la manera más eficiente de asignar/actualizar VBO en este contexto? Estoy bastante seguro de que debería usar DYNAMIC_DRAW y bufferSubData para actualizar cada objeto.

Este es de hecho el camino a seguir. En realidad, desea utilizar doble o incluso triple almacenamiento en búfer para sus objetos, es decir, tener un VBO vinculado para el dibujo, mientras actualiza los contenidos del otro con los datos nuevos. Después de glMapBuffer, se puede acceder al mapa de memoria desde todos los hilos del proceso, para que pueda tener un hilo de trabajo actualizando el búfer de vértices "atrás", mientras que el hilo de renderizado está ocupado dibujando el cuadro actual.

¿O es esto lo suficientemente pequeño en términos de huella de memoria que estoy pensando demasiado?

¿Evaluó la peor huella de memoria que está tratando? Teniendo en cuenta sus números, apuesto a que será inferior a 16MiB (150 objetos * 2048 puntos * 3 flotantes de doble precisión por punto * 8 bytes por doble = 7.4 MiB, solo 3.7Mib cuando se usan flotadores de precisión simple). Compare esto con los varios cientos de tarjetas de gráficos modernos de MiB de RAM (mi 2006 GeForce 8800GTX tiene 768MiB de RAM, y mi Radeon HD6570 tiene 1024MiB (= 1GiB).