que electronica opengl-es vbo

opengl es - electronica - ¿Cómo elegir entre GL_STREAM_DRAW o GL_DYNAMIC_DRAW?



vbo electronica (4)

Además de las respuestas dadas hasta ahora, y aunque no tiene nada que ver directamente con GLES, me gusta pegar este bit del problema 2 de la extensión ARB_buffer_storage (se presenta junto con el escritorio GL 4.4):

2) Las nuevas banderas no se asignan directamente al parámetro para glBufferData y una no puede expresarse en términos de la otra. ¿Eso importa?

La mayoría de las aplicaciones tienen un usage incorrecto y solo son sugerencias de todos modos. Las banderas son reglas duras y rápidas que deben seguirse. Sirven un propósito diferente. La idea aquí es permitir que la implementación no tenga que adivinar la aplicación y realizar menos seguimiento, y que la aplicación tenga más control. Definimos BufferData en términos de BufferStorage con las banderas más liberales permitidas (esencialmente, todo vale), pero aún así pasamos la sugerencia a la implementación para permitir que continúe adivinando la aplicación.

El problema con estos indicadores siempre ha sido que cada implementación puede tener diferentes ideas sobre cómo optimizar las diferentes rutas sugeridas por la sugerencia de uso, y cada aplicación parece tener diferentes expectativas de cómo funciona esta optimización.

El controlador GL de escritorio de Nvidias imprimirá en un perfil de depuración algunas de las decisiones que tomó para los objetos del búfer, especialmente si están almacenados en la memoria RAM del cliente o directamente en la GPU. Al jugar con esto conseguí lo siguiente:

Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped in HOST memory. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) stored in VIDEO memory has been updated. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped in HOST memory. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) stored in SYSTEM HEAP memory has been updated. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use SYSTEM HEAP memory as the source for buffer object operations. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use SYSTEM HEAP memory as the source for buffer object operations. Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast). Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast). Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast).

Lo que hice aquí fue usar un PBO para transmitir actualizaciones de textura a la GPU, con una actualización por cuadro a través del mapeo del búfer. La elección natural aquí sería usar GL_STREAM_DRAW , pero especificé GL_STATIC_DRAW . Lo que hizo el controlador fue darme un poco de búfer respaldado por VRAM inicialmente y hacer un mapeo de E / S para las dos primeras actualizaciones que hice. Pero luego, cambió de idea y usa un búfer respaldado por el cliente, que me dio exactamente el resultado que obtendría si hubiera pedido GL_STREAM_DRAW en primer lugar. Lo que vemos aquí es un ejemplo para la second guessing el texto citado anteriormente.

Todo esto es altamente específico para la implementación. Y eso también es parte de la razón por la que se creó la extensión GL mencionada, lo que le dará al programador mucho más control sobre esas cosas. Sin embargo, esta extensión, por lo que sé, no está disponible en el ámbito de OpenGL ES.

Estoy usando OpenGL ES 2.0, pero creo que también es relevante para no ES: ¿cómo saber qué "uso" elegir al crear un VBO?

Este VBO en particular se usará de 1 a 4 veces antes de que se actualice por completo, y no estoy seguro de si debo elegir GL_STREAM_DRAW o GL_DYNAMIC_DRAW.


Bueno, de acuerdo con la API de OpenGL debería usar DYNAMIC_DRAW .

CORRIENTE
Debe usar STREAM_DRAW cuando el contenido del almacén de datos se modificará una vez y se usará como máximo varias veces.

ESTÁTICO
Use STATIC_DRAW cuando el contenido del almacén de datos se modifique una vez y se use muchas veces.

DINÁMICA
Use DYNAMIC_DRAW cuando el contenido del almacén de datos se modifique repetidamente y se use muchas veces.

Asegúrese de actualizar el VBO con glBufferSubData()


El indicador de uso es una sugerencia, no una aplicación. O en otras palabras: las cosas no se rompen si usas una bandera "incorrecta". Por lo tanto, te sugiero que pruebes las 3: STATIC_DRAW, STREAM_DRAW y DYNAMIC_DRAW y elijas el que te ofrezca el mejor rendimiento, y es muy probable que se empaten.


La información sobre VBO está en el sitio del desarrollador de Apple. Por cierto, si es cierto, debería elegir GL_DYNAMIC_DRAW para actualizar el sorteo más de una vez.