El costo práctico de intercambiar efectos

16

Utilizo XNA para mis proyectos y en esos foros a veces veo referencias al hecho de que cambiar un efecto por una malla tiene un costo relativamente alto, lo que me sorprende, ya que pensé que cambiar un efecto era simplemente un caso de copiar el programa de reemplazo del sombreador a la GPU junto con los parámetros apropiados.

Me preguntaba si alguien podría explicar exactamente qué es costoso acerca de este proceso. Y poner, si es posible, 'relativamente' en contexto?

Por ejemplo, digamos que quería usar un sombreador corto para ayudar con la selección, haría lo siguiente:

  1. Cambie el efecto en cada objeto, calculando un color único para identificarlo y proporcionándolo al sombreador.
  2. Dibuje todos los objetos a un objetivo de representación en la memoria.
  3. Obtenga el color del objetivo y úselo para buscar el objeto seleccionado.

¿Qué parte del tiempo total que se tarda en completar ese proceso se dedicaría a cambiar los sombreadores? Mis instintos dirían que renderizar la escena nuevamente, no importa cuán simple sea el sombreador, sería un orden de magnitud más lento que cualquier otra parte del proceso, entonces, ¿por qué tanta preocupación por los efectos?

sebf
fuente

Respuestas:

21

El problema que está describiendo no es un problema "especial". No hay nada especialmente lento en cambiar los efectos en la GPU. El problema con los efectos cambiantes, los parámetros de efectos (incluidas las transformaciones), las texturas, los diversos estados de renderizado y el simple envío de múltiples comandos de dibujo es que es necesario que se envíe otro lote a la GPU .

Los lotes están vinculados a la CPU y solo obtienes unos pocos miles * por marco para usar.

Depende de la CPU y de qué otro trabajo está haciendo, pero supongamos que obtiene aproximadamente 1000 lotes por fotograma. Si está renderizando un objeto por lote, puede dibujar alrededor de 1000 objetos en la pantalla antes de encontrar problemas.

Si de repente agrega selección y tiene que renderizar todos sus objetos dos veces, entonces está limitado a dibujar solo 500 objetos.

(Entonces, si solo tienes una pequeña cantidad de objetos, ¡no te preocupes por eso!)

Para reducir la cantidad de lotes que está utilizando, básicamente tiene que "ser inteligente" al respecto. El método prototípico para hacer esto es combinar inteligentemente múltiples objetos en un solo lote. En particular, busque " instancing ". Quizás pueda usar el número de instancia para asignar un color único a cada objeto dentro de su sombreador.

Otra técnica, especialmente adecuada para la selección, es eliminar los objetos renderizados en el software para que no esté renderizando nada que sepa que no está tocando el píxel seleccionado.

Aquí hay una presentación completa de diapositivas de NVidia titulada "Lote, Lote, Lote: ¿Qué significa realmente?" (PDF) que tiene buenos gráficos y cosas que explican esto. También enumera algunas técnicas para reducir su recuento de lotes.

Andrew Russell
fuente
¡Convenido! Gracias por explicar y las sugerencias, lo que leo tiene mucho más sentido ahora. Gracias también por la presentación de NVidia, solo la estoy leyendo ahora y es muy útil.
sebf
1
Enlace actualizado al documento "Lote, Lote, Lote": ce.u-sys.org/Veranstaltungen/…
Marton
1
Gracias Marton, he editado el nuevo enlace en la publicación :)
Andrew Russell