Pesquisar em Unity

Dicas de Asa para profiling e otimização de shaders

Algumas das melhores dicas de Asa Reed: como escolher entre um shader de vértices ou de fragmentos, ferramentas de depuração e, finalmente, suas 7 otimizações essenciais preferidas.

Shader de vértices ou de frangmentos: Qual escolher?

Shader de vértices: Se você está preocupado principalmente com o desempenho, um shader de vértice é provavelmente a sua melhor opção. Os shaders de vértices funcionam em cada vértice da sua malha, enquanto os shaders de fragmentos funcionam em cada pixel dos triângulos compostos por esses vértices.

Os shaders de vértices são limitados: não é possível obter dados exatos de iluminação ou executar mapeamento de textura com um shader de vértices. No entanto, em contraste com o shader de fragmento, é possível deslocar as coordenadas da textura UV em qualquer extensão (por exemplo, para conseguir um efeito de superfície animada).

Unity-shader-optimization-vertex-shader

Um exemplo de um modelo com um shader de vértices, dos exemplos de shaders de vértices e de fragmentos..

Os efeitos de iluminação e superfície são mais rápidos no shaders de vértices, mas resultam em menor qualidade/fidelidade visual. Todas as operações que visam especificamente a geometria (vértices) devem ser sempre executadas com um shader de vértices, como por exemplo, skinning na GPU.

Shader de fragmentos : se você pretende obter efeitos visuais de alta qualidade ou efeitos de superfície interessantes, e precisar de iluminação suave e adequada, você deve usar um shader de fragmentos. Preste sempre atenção ao que você está exatamente adicionando aos shaders de fragmentos e tente simplificar essas operações ou movê-las para o shader de vértices.

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

O mesmo modelo com shader de vértices e de fragmento, dos exemplos de shaders de vértices e de fragmentos..

Especialmente em Unity, preste atenção a qualquer definição #pragma ou outras funcionalidades Unity incorporadas no seu código do shader. Você pode não sentir como está sobrecarregando seu shader com uma operação simples, como modificar o Alpha, mas se o mesmo shader define “Pragma Surf ShinPhong ", dezenas de cálculos são inseridos em seu shader para calcular a iluminação de Blinn-Phong. O código que estas definições de Iluminação adicionam pode ser encontrado no arquivo lighting.cginc no seu diretório de instalação Unity. Para obter informação adicional, consulte os documentos Modelos de iluminação personalizados em Surface Shaders.

Profiling de seus shaders

O Frame debugger de Unity permite congelar a reprodução de um jogo em execução em um frame específico para ver os drawcalls individuais usados para renderizar esse frame. Além de listar os drawcalls, o depurador permite que você passe por eles um a um, para poder ver com grande detalhe como a cena é composta pelos elementos gráficos.

Unity-shader-optimization-frame-debugger

Depurador de Frame Unity

Na versão 2017.1, também incluímos informações sobre o processamento de geometria e fornecemos feedback sobre por que uma determinada malha não está sendo processada em batch se foi configurada para isso.

Existem também excelentes ferramentas externas para depuração de shaders em hardware específico:

  1. Para iOS e Mac OS: Xcode possui um excelente Frame Profiler integrado que inclui muitas opções úteis: capturar toda a memória que o GPU está usando em um determinado frame; camera.render para penetrar no coração do Código de desenho; Drill Down para ter uma exibição de hierarquia aninhada do que está sendo desenhado e a guia FPS para mostrar como cada shader afeta o tempo total de renderização.

    Unity-shader-optimization-xcode_profiler

    Frame Profiler de Xcode

  2. No PC e no Mac, as ferramentas RenderDoc e Intel GPA são bastante detalhadas e possuem a maior compatibilidade de hardware.

  3. Ao depurar um hardware específico por desempenho ou saída incorreta, tal como um chipset móvel como ARM Mali, ou PS4, Xbox, Nintendo Switch etc., use SEMPRE o depurador de frames do fabricante (às vezes chamado Frame Profiler ou Frame Analyzer). Suas ferramentas quase sempre possuem os dados mais exatos para o chipset correspondente e provavelmente terão conjuntos de dados expandidos em comparação com as ferramentas mais genéricas mencionadas acima.

Sete otimizações essenciais de shader

Em uma base por frame, geralmente mais trabalho é feito pelo seu código de shader do que pelo código do seu jogo. Experimente essas otimizações para ajudar a manter seu desempenho / taxa de FPS agradável e suave

  1. Aplique menos matemática não constante. Use constantes ou "Uniformes Dinâmicos" (por exemplo, x = 4/33, x = 4xsin (24)).
  2. Multiplique os valores escalares (float, int) antes dos valores vetoriais (float3, float4).
  3. Evite descartar a instrução sempre que possível, inclusive para o teste alpha (aplica-se principalmente à versão móvel). Observe suas sobreposições.
  4. Se possível, mantenha seus cálculos em um shader de vértices.
  5. Se possível, especifique uma máscara de escritura para uma operação vetorial, na medida do possível (se não usa todos os componentes do resultado).
  6. Evite ramificação com base em valores dinâmicos / não-uniformes (if-else, loops).
  7. Comprove o impacto das operações (discard(), floor(), etc.) em seu modelo de renderização (OpenGL 2, OpenGL 3, OpenGL ES, etc.) e hardware.
Mais recursos

Documentos e tutoriais sobre Shader:

Queremos saber! Você gostou deste conteúdo?

Sim, continue. Bem. Poderia ser melhor