opengl - legal - oraciones directas e indirectas ejemplos
¿Cuáles son las ventajas de usar la representación indirecta en OpenGL? (2)
Leí que las API como glDrawElementsIndirect
, glDrawArraysIndirect
nos ayudan en la representación indirecta. La representación indirecta es diferente de la directa en la forma en que los parámetros de representación, como "número de atributos de vértice", "número de instancias para dibujar", "atributo de vértice de inicio del objeto de búfer", etc., se proporcionan en un objeto de búfer por la GPU en lugar de siendo proporcionado por la CPU en el sorteo de la llamada.
Lo entendí. También explicó que la ventaja es que se procesa más rápido porque no hay interacción de CPU involucrada. Pero espera, ¿no fue la CPU la que hizo la llamada de render? Todavía especificó el modo de renderizado ( GL_TRIANGLES
etc.). También es posible que cargue los atributos de vértice.
Entonces, ¿toda la ganancia de rendimiento en la representación indirecta se tiene en cuenta simplemente al no tener que pasar estas pequeñas variables : "recuento", "recuento primitivo", "primer atributo de vértice", "recuento de instancias"? Esto no tiene mucho sentido para mí. (Tampoco está cambiando ningún estado)
En la representación directa, la CPU se ocupa de preparar y transmitir los datos de índice de su propia memoria, a través de un bus con ancho de banda limitado a la GPU. Debe verificar el estado de la GPU y sincronizarlo. Cada uno de esos pasos consume tiempo.
El uso indirecto de todo lo que hace la CPU es el envío de un comando corto, que inicia un gran lote de operaciones de dibujo. Esto ahorra ancho de banda del bus. Y debido a que la GPU funcionará durante un período de tiempo más largo, hay menos interrupciones que obligan a la CPU a detener lo que está haciendo en este momento (cambio de contexto), lo que significa que las complejas tareas numéricas, como las simulaciones físicas, se ejecutarán con mayor rendimiento.
La ganancia de rendimiento a menudo no se debe tanto a pasar una pequeña variable como "recuento" o "recuento de instancias", sino a saber esto. Para conocer estos valores, debe realizar un viaje de ida y vuelta a la CPU, que solo es posible después de que el resultado esté disponible, es decir, después de una sincronización del servidor (además de que agrega la latencia del bus).
Digamos que está utilizando retroalimentación de transformación con un sombreador de geometría. Esto significa que no importa en qué se alimente, no sabe realmente lo que sale en el otro extremo, no antes de que el lote haya terminado y haya consultado los recuentos, de todos modos.
La representación indirecta aborda esto, no es necesario que lo sepa y, en realidad, no quiere saberlo. La información entra en un objeto de búfer y la GPU puede acceder a él sin su intervención.
Eso es análogo a la representación condicional. En realidad, podría omitir todo el asunto de la representación condicional, ¿verdad? En lugar de enviar comandos a la cola de comandos que tal vez no se ejecuten (¡qué ineficiente!), Puede ejecutar su consulta de oclusión y ver si pasa o no, y luego decidir si enviar los objetos que desea dibujar.
Excepto que esto significa que debe esperar hasta que la consulta (y, por lo tanto, el lote anterior) finalice, sincronice y realice una transferencia de PCIe antes de tomar esta decisión. Durante este tiempo, es probable que la GPU se detenga, y aún no ha configurado los búferes / texturas correctos y los comandos enviados. En realidad, por lo tanto, es mucho más eficiente enviar comandos de manera especulativa y dejar que el controlador / GPU decida si los desecha o si los dibuja.
Esa es también la idea detrás de ARB_query_buffer_object
, que le permite leer el resultado de una consulta en un objeto de búfer.
EDITAR:
Además, la representación indirecta permite un envío mucho más eficiente de los lotes de comandos de representación (especialmente en combinación con asignaciones persistentes) que pueden evitar gran parte o la totalidad de las sincronizaciones servidor / cliente y CPU / GPU normalmente presentes y pueden provenir de otro núcleo de procesador y ahorra Llamada fija por encima de la cabeza. Vea las páginas 62 en adelante en la charla de Cass Everitt .