Version: 2019.4
Asynchronous Shader compilation
Rendering con Shaders Remplazados

Consejos de rendimiento al escribir shaders

Sólo calcule lo que necesita

Cuantos más cálculos y procesamientos tenga que hacer su código shader, más impactará el rendimiento de su juego. Por ejemplo, soportar el color por material es bueno para hacer un shader más flexible, pero si siempre deja ese conjunto de colores en blanco, entonces los cálculos inútiles se realizan para cada vértice o píxel renderizado en la pantalla.

La frecuencia de los cálculos también afectará el rendimiento de su juego. Por lo general, hay muchos más píxeles renderizados (y, posteriormente, más ejecuciones píxel shader) que vértices (ejecuciones vertex shader) y más vértices que los objetos que se renderizan. Donde sea posible, mueva los cálculos fuera del código shader de píxeles en el código del shader de vértices, o muévalos completamente de los shaders y configure los valores en un script.

Surface Shaders Optimizados

Los Surface Shaders son ideales para escribir shaders que interactúan con la iluminación. Sin embargo, sus opciones predeterminadas están ajustadas para cubrir un amplio número de casos generales. Ajústelos para situaciones específicas para que los shaders corran más rápido o al menos sean más pequeños:

  • La directiva approxview para los shaders que utilizan la dirección de la vista (es decir, Specular) hace que la dirección de la vista sea normalizada por vértice en lugar de por píxel. Esto es aproximado, pero a menudo bastante bueno.
  • La halfasview para los tipos de shader especulares es aún más rápida. El medio vector (a medio camino entre la dirección de iluminación y el vector de vista) se calcula y normaliza por vértice, y la función de iluminación recibe el medio vector como parámetro en lugar del vector de vista.
  • noforwardadd Hace que un shader admita totalmente la luz unidireccional en Forward rendering solamente. El resto de las luces pueden tener un efecto como luces por vértice o armónicos esféricos. Esto es genial para hacer su shader más pequeño y asegúrese de que siempre se hace en un solo paso, incluso con varias luces presentes.
  • noambient Desactiva la iluminación ambiental y las luces armónicas esféricas en un shader. Esto puede hacer que el rendimiento sea ligeramente más rápido.

Precisión de los cálculos

Cuando se escriben shaders en Cg/HLSL, hay tres tipos de números básicos: float,half y fixed (mire Tipos de datos y precisión).

Para obtener un buen rendimiento, utilice siempre la precisión más baja posible. Esto es especialmente importante en plataformas móviles como iOS y Android. Las buenas reglas de juego son:

  • Para posiciones en el espacio mundial y coordenadas de textura, use la precisión float.
  • Para todo lo demás (vectores, colores HDR, etc.), comience con la half de precisión. Aumente sólo si es necesario.
  • Para operaciones muy sencillas sobre datos de textura, use precisión fixed.

En la práctica, exactamente qué tipo de número utilizar depende de la plataforma y la GPU. Generalmente hablando:

  • Todas las modernas GPUs de escritorio siempre calcularán todo en la precisión de float completa, por lo que float/half/fixed terminará siendo exactamente el mismo debajo. Esto puede dificultar las pruebas, ya que es más difícil ver si la precisión media/fija es realmente suficiente, así que pruebe siempre sus sombreadores en el dispositivo de destino para obtener resultados precisos.
  • Las GPU móviles tienen un soporte de precisión `half’ real. Esto suele ser más rápido, y utiliza menos energía para hacer cálculos.
  • La precisión Fixed generalmente sólo es útil para las GPU móviles más antiguas. La mayoría de las GPU modernas (las que pueden ejecutar OpenGL ES 3 o Metal) tratan internamente la precisión fixed y half exactamente igual.

Mire Tipos de Datos y Precisión para más detalles.

Pruebas Alpha

La función fija AlphaTest - o su equivalente programable, clip() - tiene diferentes características de rendimiento en diferentes plataformas:

  • Generalmente obtienes una pequeña ventaja al usarlo para eliminar píxeles totalmente transparentes en la mayoría de las plataformas.
  • Sin embargo, en las GPU PowerVR que se encuentran en iOS y en algunos dispositivos Android, las pruebas alfa requieren mucho de recursos. No intente utilizarlo para optimizar el rendimiento en estas plataformas, ya que hace que el juego se ejecute más lento de lo habitual.

Color Mask

En algunas plataformas (en su mayoría GPUs móviles que se encuentran en dispositivos iOS y Android), utilizar ColorMask para dejar fuera algunos canales (por ejemplo, “ColorMask RGB”) puede ser intensivo para los recursos.

Asynchronous Shader compilation
Rendering con Shaders Remplazados