Buscar en Unity

Consejos de Asa para el perfilado y la optimización del shader

A continuación se presentan algunos de los mejores consejos de Asa Reed: Cómo elegir entre un shader de fragmentos o de vértices, las herramientas de depuración, y, finalmente, sus 7 optimizaciones esenciales preferidas.

Shader de fragmentos o vértices: ¿Cuál elegir?

Shader de vértices: Si estás más preocupado acerca del desempeño, entonces un shader de vértices probablemente sea tu mejor opción. Los shaders de vértices operan en cada vértice de la malla, mientras que los shaders de fragmentos lo hacen en cada pixel dentro de los triángulos compuestos por estos vértices.

Los shaders de vértices vienen con limitaciones: Es imposible obtener datos exactos de la iluminación o hacer un mapeo de textura en un shader de vértices. Sin embargo, es posible desplazar las coordenadas de texturas uv mediante una cantidad arbitraria (para lograr una especie de efecto de superficie animada, por ejemplo) en un shader de vértices, en lugar de un shader de fragmentos.

Unity-shader-optimization-vertex-shader

Un ejemplo de un modelo con un shader de vértices, de los ejemplos de shaders de vértices y de fragmentos.

Los efectos de iluminación y de superficie en los shaders de vértices tienden a ejecutarse de una manera más rápida pero dan como resultado una calidad o fidelidad visual menor o inferior. Cualquier operación dirigida de manera específica a la geometría (vértices) siempre debe hacerse en un shader de vértices; por ejemplo, personalización del GPU.

Shader de fragmentos: Si estás apuntando a lograr efectos visuales de gama alta o efectos superficiales interesantes, y necesitas una iluminación uniforme y correcta, considera el uso de un shader de fragmentos. Siempre presta atención cuidadosa a lo que estás agregando exactamente a tus shaders de fragmentos y haz lo posible para simplificar estas operaciones o trasládalas al shader de vértices.

Unity-shader-optimization-vertex-and-fragment-shaders

El mismo modelo con un shader de vértices y de fragmentos, de los ejemplos de shaders de vértices y de fragmentos.

Específicamente dentro de Unity, toma nota de cualquier definición de #pragma u otros usos de la funcionalidad incorporada de Unity dentro de tu código del shader. Aunque puedas pensar que tu shader está haciendo esfuerzos agotadores por algo tan simple como modificar el alfa, si este mismo shader define "#pragma surface surf BlinnPhong", existen docenas de cálculos que se inyectan a tu shader para calcular la iluminación de Blinn-Phong. Puedes ver el código que estas definiciones de la iluminación agregan observando el archivo lightning.cginc de tu directorio de instalación de Unity. Para obtener información adicional, consulta los documentos Modelos de iluminación personalizados en los Shaders de superficie.

Perfilando tus shaders

de Unity Frame debugger te permite congelar la reproducción para un juego en ejecución en un cuadro en particular y visualizar las llamadas individuales que se utilizan para renderizar dicho cuadro. Al igual que el listado de las llamadas, el depurador también te permite pasar por ellos uno a la vez, de manera que puedas ver con gran detalle cómo se construye la Escena a partir de sus elementos gráficos.

Unity-shader-optimization-frame-debugger

El depurador de cuadros de Unity

Con la versión 2017.1, también estamos incluyendo información acerca de los lotes de geometría y brindándote retroalimentación específica de por qué una cierta malla no está generando lotes si está configurada para hacerlo.

También hay varias herramientas externas para la depuración del shader en hardware específico:

  1. Para iOS y Mac OS: Xcode cuenta con un perfilador de cuadros grandioso incorporado, que incluye opciones tales como captura de toda la memoria que el GPU está utilizando en un cuadro específico; camera.render, para aprovechar al máximo el código de dibujo y penetrar lo suficiente para visualizar una vista de la jerarquía anidada de lo que se está dibujando, y la pestaña FPS, que muestra cómo cada shader afecta al tiempo total de renderización.

    Unity-shader-optimization-xcode_profiler

    El perfilador de cuadros de Xcode.

  2. En PC y Mac, las herramientas RenderDoc y GPA de Intel llegan muy profundo y suelen tener la máxima compatibilidad de hardware.

  3. Cuando depures un hardware específico objetivo para el desempeño o una salida incorrecta, como un chipset móvil como ARM Mali o PS4, Xbox, Nintendo Switch, etc., SIEMPRE utiliza el depurador de cuadros propio del fabricante (a veces se llama Frame Profiler o Frame Analyzer). Sus herramientas casi siempre tendrán los datos más exactos para dicho chipset y probablemente tendrán conjuntos de datos expandidos en comparación con las herramientas más genéricas, mencionadas líneas arriba.

7 optimizaciones fundamentales del shader

A nivel de cuadro por cuadro, por lo general el código del shader hace un trabajo mucho más grande que el código del juego. Prueba estas optimizaciones para ayudar a mantener el desempeño y la tasa de FPS eficientes y uniformes.

  1. Haz menos matemática no constante. Utiliza constantes o "uniformes dinámicos" (por ejemplo, x=4/33, x=4xsin(24)).
  2. Multiplica los valores escalares (float, int) antes que los factores vectoriales (float3, float4).
  3. Evita descartar la instrucción en la medida de lo posible, incluso para la prueba alfa (se aplica principalmente a la versión móvil). Observa tus superposiciones.
  4. Si es posible, mantén tus cálculos en un shader de vértices.
  5. Especifica una máscara de escritura para una operación vectorial, en la medida de lo posible (si no utiliza todos los componentes del resultado).
  6. Evita crear ramas en función de los valores establecidos en forma dinámica o no uniformes (instrucciones if-else, bucles).
  7. Comprueba el impacto de las operaciones (tales como discard(), floor(), etc.) en tu modelo de renderer (OpenGL 2, OpenGL 3, OpenGL ES, etc.) y el hardware.
Mas recursos

Documentos y tutoriales de Shader:

¡Debemos saberlo! ¿Te gustó este contenido?

Sí. Que sigan llegando Me da igual. Podría ser mejor
Lo tengo

Usamos cookies para brindarte la mejor experiencia en nuestro sitio web. Visita nuestra página de política de cookies si deseas más información.