O que você está procurando?
Hero background image
Animate with Unity
Otimização de desempenho para gráficos de última geração em PC e console

Este é o segundo de uma série de artigos que apresenta dicas de otimização para seus projetos Unity. Use-os como um guia para executar em taxas de quadros mais altas com menos recursos. Depois de experimentar essas práticas recomendadas, verifique as outras páginas da série:

As ferramentas gráficas do Unity permitem que você crie gráficos otimizados em qualquer estilo, em diversas plataformas – desde dispositivos móveis até consoles e desktops de última geração. Esse processo geralmente depende da sua direção artística e do pipeline de renderização, portanto, antes de começar, recomendamos revisar os pipelines de renderização disponíveis.

UMA ILUSTRAÇÃO DE COMO FUNCIONA O FORWARD RENDERING
UMA ILUSTRAÇÃO DE COMO FUNCIONA O FORWARD RENDERING
Renderização direta

Ao escolher um pipeline de renderização, leve estas considerações em consideração. Além de escolher um pipeline, você precisará selecionar um caminho de renderização.

O caminho de renderização representa uma série específica de operações relacionadas à iluminação e sombreamento. A decisão sobre um caminho de renderização depende das necessidades e do hardware alvo do seu aplicativo.

Caminho de renderização direto

A renderização direta é usada tanto no Universal Render Pipeline (URP) quanto no Built-in Render Pipeline. Na renderização direta, a placa gráfica projeta a geometria e a divide em vértices. Esses vértices são divididos em fragmentos, ou pixels, que são renderizados na tela, criando a imagem final.

O pipeline passa cada objeto, um de cada vez, para a API gráfica. A renderização direta tem um custo para cada luz, portanto, quanto mais luzes na sua cena, mais tempo levará a renderização.

O renderizador direto do pipeline integrado desenha cada luz em uma passagem separada por objeto. Se várias luzes atingirem o mesmo GameObject, isso poderá criar um overdraw significativo, onde áreas sobrepostas precisam desenhar o mesmo pixel mais de uma vez. Para reduzir o overdraw, minimize o número de luzes em tempo real.

Em vez de renderizar uma passagem por luz, o URP seleciona as luzes por objeto. Isso permite que a iluminação seja calculada em uma única passagem, resultando em menos chamadas de desenho em comparação com o Forward Renderer do Built-In Render Pipeline.

UMA ILUSTRAÇÃO DE COMO FUNCIONA O CAMINHO DE RENDERIZAÇÃO DE SOMBREAMENTO DIFERIDO
UMA ILUSTRAÇÃO DE COMO FUNCIONA O CAMINHO DE RENDERIZAÇÃO DE SOMBREAMENTO DIFERIDO
Renderização adiada

O pipeline de renderização integrado, o URP e o pipeline de renderização de alta definição (HDRP) também usam o caminho de renderização de sombreamento diferido. No Sombreamento Diferido, a iluminação não é calculada por objeto.

Em vez disso, o Deferred Shading adia a renderização pesada, como a iluminação, para um estágio posterior e usa duas passagens. Na primeira passagem, também chamada de passagem de geometria do buffer G , o Unity renderiza os GameObjects. Esta passagem recupera vários tipos de propriedades geométricas e as armazena em um conjunto de texturas.

As texturas do buffer G podem incluir:

- Cores difusas e especulares

- Suavidade superficial

- Oclusão

- Normais do Espaço Mundial

- Emissão + ambiente + reflexos + mapas de luz

Na segunda passagem, ou passagem de iluminação, o Unity renderiza a iluminação da cena com base no G-buffer. Imagine iterar cada pixel e calcular as informações de iluminação com base no buffer em vez de nos objetos individuais. Adicionar mais luzes sem projeção de sombras no Deferred Shading não causa o mesmo impacto no desempenho da renderização direta.

Embora a escolha de um caminho de renderização não seja exatamente uma otimização em si, ela pode afetar a forma como você otimiza seu projeto. As outras técnicas e fluxos de trabalho nesta seção variam dependendo do pipeline de renderização e do caminho selecionado.

UMA INTERFACE VISUAL BASEADA EM NÓS PARA CONSTRUIR SHADERS NO SHADER GRAPH
UMA INTERFACE VISUAL BASEADA EM NÓS PARA CONSTRUIR SHADERS NO SHADER GRAPH
Gráficos de sombreamento

Tanto HDRP quanto URP suportam Shader Graph, uma interface visual baseada em nó para criação de shader. Ele permite que usuários sem experiência em programação de shaders criem efeitos de sombreamento complexos.

Mais de 150 nós estão disponíveis atualmente no Shader Graph. Além disso, você pode criar seus próprios nós personalizados com a API.

Cada shader em um Shader Graph começa com um Master Node, que determina a saída do gráfico. Construa a lógica do shader adicionando e conectando nós e operadores na interface visual.

O Shader Graph passa então para o back-end do pipeline de renderização. O resultado final é um shader ShaderLab funcionalmente semelhante a outro escrito em HLSL ou Cg.

A otimização de um Shader Graph segue muitas das mesmas regras que se aplicam aos shaders HLSL ou Cg tradicionais; um aspecto importante é que quanto mais processamento o seu Shader Graph fizer, mais impactará o desempenho do seu aplicativo.

Se você estiver limitado pela CPU, otimizar seus shaders não melhorará a taxa de quadros, mas poderá melhorar a vida útil da bateria em plataformas móveis.

Se você estiver vinculado à GPU, siga estas diretrizes para melhorar o desempenho com Shader Graph:

Remova nós não utilizados: Não altere nenhum padrão nem conecte nós, a menos que essas alterações sejam necessárias. Shader Graph compila automaticamente quaisquer recursos não utilizados. Quando possível, transforme valores em texturas. Por exemplo, em vez de usar um nó para iluminar uma textura, aplique o brilho extra no próprio recurso de textura.

Use um formato de dados menor quando possível: Considere usar Vector2 em vez de Vector3, ou reduzir a precisão (por exemplo,half em vez de float), se o seu projeto permitir.

Reduza as operações matemáticas: As operações do shader são executadas muitas vezes por segundo, portanto, tente otimizar os operadores matemáticos sempre que possível. Procure combinar resultados em vez de criar uma ramificação lógica. Use constantes e combine valores escalares antes de aplicar vetores. Por fim, converta todas as propriedades que não precisam aparecer no Inspetor como nós embutidos. Todas essas melhorias incrementais podem ajudar no seu orçamento de quadros.

Ramifique uma visualização: À medida que seu gráfico fica maior, sua compilação pode ficar mais lenta. Simplifique seu fluxo de trabalho com uma ramificação menor e separada contendo apenas as operações que você deseja visualizar no momento. Em seguida, itere mais rapidamente neste branch menor até atingir os resultados desejados. Se a ramificação não estiver conectada aonó mestre, você poderá deixar a ramificação de visualização com segurança em seu gráfico. O Unity remove nós que não afetam a saída final durante a compilação.

Otimize manualmente: Mesmo programadores gráficos experientes ainda podem usar um Shader Graph para estabelecer algum código padrão para um shader baseado em script. Selecione o ativoShader Graphe selecioneCopiar Shaderno menude contexto. Crie um novo shader HLSL/Cg e cole no Shader Graph copiado. Esta é uma operação unilateral, mas permite obter desempenho adicional com otimizações manuais.

A LISTA DE SHADERS SEMPRE INCLUÍDOS NAS CONFIGURAÇÕES GRÁFICAS
A LISTA DE SHADERS SEMPRE INCLUÍDOS NAS CONFIGURAÇÕES GRÁFICAS
Remover configurações de shader integradas

Remova todos os shaders não utilizados da lista chamada Always Included Shaders, que é encontrada nas configurações de Gráficos (Editar > Configurações do Projeto > Gráficos). Adicione aqui todos os shaders necessários para a vida útil do aplicativo.

Variantes de shader de faixa

Use as diretivas pragma de compilação de Shader para adaptar a compilação de um shader a cada plataforma de destino. Em seguida, use uma palavra-chave shader (ou nó de palavra-chave Shader Graph ) para criar variantes de shader com determinados recursos ativados ou desativados.

As variantes de shader podem ser úteis para recursos específicos da plataforma, mas também aumentam o tempo de construção e o tamanho do arquivo. Você pode impedir que variantes de sombreador sejam incluídas em sua compilação se souber que elas não são obrigatórias.

Primeiro, analise o Editor.log para verificar o tempo e o tamanho do shader. Em seguida, localize as linhas que começam com Compiled shader e Compressed shader.

Este log de exemplo mostra as seguintes estatísticas:

Shader compilado 'TEST Standard (configuração especular)' em 31,23s
d3d9 (total de programas internos: 482, único: 474)
d3d11 (total de programas internos: 482, único: 466)
metal (total de programas internos: 482, único: 480)
glcore (total de programas internos: 482, único: 454)
Shader compactado 'TEST Standard (configuração especular)' no d3d9 de 1,04 MB a 0,14 MB
Shader compactado 'TEST Standard (configuração especular)' no d3d11 de 1,39 MB a 0,12 MB
Shader compactado 'TEST Standard (configuração especular)' em metal de 2,56 MB a 0,20 MB
Shader compactado 'TEST Standard (configuração especular)' no glcore de 2,04 MB a 0,15 MB

Essas estatísticas dizem algumas coisas sobre o shader:

- Expande-se em 482 variantes devido ao#pragma multi_compileeshader_feature.

- O Unity compacta o shader incluído nos dados do jogo para aproximadamente a soma dos tamanhos compactados: 0.14+0.12+0.20+0.15 = 0.61 MB.

- Em tempo de execução, o Unity mantém os dados compactados na memória (0,61 MB), enquanto os dados da API gráfica usada atualmente permanecem descompactados. Por exemplo, se sua API atual for Metal, isso representaria 2,56 MB.

Após uma compilação, o Auditor de Projeto (experimental) pode analisar o Editor.log para exibir uma lista de todos os shaders, palavras-chave de shader e variantes de shader compiladas no projeto. Ele também pode analisar o Player.log após a execução do jogo. Isso mostra quais variantes o aplicativo realmente compilou e usou em tempo de execução.

Utilize essas informações para construir um sistema de remoção de shaders programável e reduzir o número de variantes. Isso pode melhorar os tempos de compilação, os tamanhos de compilação e o uso de memória em tempo de execução.

Leia o artigo Removendo variantes de shader programáveis ​​para ver esse processo em detalhes.

ANTI-ALIASING COMO EFEITO DE PÓS-PROCESSAMENTO EM UMA CÂMERA HDRP
ANTI-ALIASING COMO EFEITO DE PÓS-PROCESSAMENTO EM UMA CÂMERA HDRP
Bordas suaves com anti-aliasing

O anti-aliasing contribui para uma qualidade de imagem mais nítida, reduzindo bordas irregulares e minimizando o Aliasing especular.

Se você estiver usando a renderização direta com o pipeline de renderização integrado, o Multisample Anti-aliasing (MSAA) estará disponível nas configurações de Qualidade . MSAA produz anti-aliasing de alta qualidade, mas pode ser caro. A configuração chamada MSAA Sample Count no menu suspenso define quantas amostras o renderizador usa para avaliar o efeito (None, 2X, 4X, 8X). Se você estiver usando a renderização direta com URP ou HDRP, poderá ativar o MSAA no URP Asset ou no HDRP Asset, respectivamente.

Alternativamente, você pode adicionar anti-aliasing como efeito de pós-processamento. Isso aparece no componente Câmera (em Anti-aliasing) com algumas opções:

- Anti-aliasing aproximado rápido(FXAA) suaviza as bordas em um nível por pixel. Este é o tipo de anti-aliasing que consome menos recursos. Desfoca ligeiramente a imagem final.

- O Anti-aliasing morfológico de subpixel(SMAA) combina pixels com base nas bordas de uma imagem. Ele oferece resultados muito mais nítidos que o FXAA e é adequado para estilos de arte planos, tipo desenho animado ou limpos.

No HDRP, você também pode usar FXAA e SMAA no anti-aliasing de pós-processamento na câmera com uma opção adicional:

- Anti-aliasing temporal(TAA) suaviza bordas usando quadros do buffer de histórico. Isto funciona de forma mais eficaz do que FXAA, mas requervetores de movimentopara funcionar. O TAA também pode melhorara oclusão ambientalea volumetria. Geralmente tem qualidade superior à FXAA, mas requer recursos extras e pode produzir artefatos fantasmas ocasionais.

AJUSTE AS CONFIGURAÇÕES DO LIGHTMAPPING (WINDOWS > RENDERING > LIGHTING SETTINGS) E O TAMANHO DO LIGHTMAP PARA LIMITAR O USO DA MEMÓRIA.
AJUSTE AS CONFIGURAÇÕES DO LIGHTMAPPING (WINDOWS > RENDERING > LIGHTING SETTINGS) E O TAMANHO DO LIGHTMAP PARA LIMITAR O USO DA MEMÓRIA.
Assar mapas de luz

A opção mais rápida para criar iluminação é aquela que não precisa ser computada por quadro. Use o Lightmapping para preparar a iluminação estática apenas uma vez, em vez de calculá-la em tempo real.

Adicione iluminação dramática à sua geometria estática usando Iluminação Global (GI). Marque a opção Contribuir GI para objetos para armazenar iluminação de alta qualidade na forma de mapas de luz.

O processo de geração de um ambiente com mapeamento de luz leva mais tempo do que apenas colocar uma luz na cena, mas oferece benefícios importantes, como:

- Executando duas ou três vezes mais rápido para luzes de dois por pixel

- Visuais aprimorados por meio da Iluminação Global, que pode calcular iluminação direta e indireta de aparência realista, enquanto o lightmapper suaviza e elimina o ruído do mapa resultante

- Sombras e iluminação preparadas são renderizadas sem o impacto no desempenho que normalmente resulta da iluminação e sombras em tempo real

Cenas mais complexas podem exigir longos tempos de cozimento. Se o seu hardware suportar o Progressive GPU Lightmapper (em visualização), esta opção pode acelerar drasticamente a geração do seu lightmap usando a GPU em vez da CPU.

Siga este guia para começar a usar Lightmapping no Unity.

CADA SONDA DE REFLEXÃO CAPTURA UMA IMAGEM DE SEU ARREDOR EM UMA TEXTURA DE CUBEMAP.
CADA SONDA DE REFLEXÃO CAPTURA UMA IMAGEM DE SEU ARREDOR EM UMA TEXTURA DE CUBEMAP.
Minimize as sondas de reflexão

Embora as Sondas de Reflexão possam criar reflexos realistas, elas podem ser caras em termos de lotes. Como tal, experimente estas dicas de otimização para minimizar o impacto no desempenho:

- Use mapas de cubos de baixa resolução, máscaras de seleção e compactação de textura para melhorar o desempenho do tempo de execução.

- UsarTipo: Cozidopara evitar atualizações por quadro.

- Se o uso deTipo: Tempo realfor necessário no URP, tente evitarEvery Framesempre que possível. Ajuste as configurações domodo de atualizaçãoedivisão de tempopara reduzir a taxa de atualização. Você também pode controlar a atualização com a opçãoVia Scriptingerenderizar a análisea partir de um script personalizado.

- Se o uso deTipo: Tempo realfor necessário no HDRP, selecione o modoOn Demand. Você também pode modificar asconfiguraçõesdo quadroemConfigurações do projeto > Configurações padrão do HDRP.

- Reduza a qualidade e os recursosdo Reflexo em tempo realpara melhorar o desempenho.

DESATIVAR SHADOW CASTING PARA REDUZIR CHAMADAS DE DRAW.
DESATIVAR SHADOW CASTING PARA REDUZIR CHAMADAS DE DRAW.
Desativar sombras

A projeção de sombra pode ser desativada por Mesh Renderer e light. Desative as sombras sempre que possível para reduzir as chamadas de desenho. Você também pode criar sombras falsas usando uma textura desfocada aplicada a uma malha ou quadrado simples abaixo de seus personagens. Caso contrário, você pode criar sombras blob com shaders personalizados.

Em particular, evite ativar sombras para Point Lights. Cada luz pontual com sombras requer seis passagens de mapa de sombras por luz – compare isso com uma única passagem de mapa de sombras para uma luz pontual. Considere substituir luzes pontuais por luzes pontuais onde sombras dinâmicas são absolutamente necessárias. Se você puder evitar sombras dinâmicas, use um mapa de cubo como Light.cookie com suas luzes pontuais.

Substitua um efeito de shader

Em alguns casos, você pode aplicar truques simples em vez de adicionar várias luzes extras. Por exemplo, em vez de criar uma luz que brilha diretamente na câmera para dar um efeito de iluminação Rim, use um shader para simular Rim Lighting (vejaexemplos de Surface Shaderpara uma implementação disso em HLSL).

AS CAMADAS PODEM LIMITAR A INFLUÊNCIA DA SUA LUZ A UMA MÁSCARA DE ESCOLHA ESPECÍFICA.
AS CAMADAS PODEM LIMITAR A INFLUÊNCIA DA SUA LUZ A UMA MÁSCARA DE ESCOLHA ESPECÍFICA.
Use camadas leves

Para cenas complexas com muitas luzes, separe seus objetos usando camadas e, em seguida, restrinja a influência de cada luz a uma Máscara de Cullingespecífica.

SONDAS DE LUZ ILUMINAM OBJETOS DINÂMICOS NO FUNDO.
SONDAS DE LUZ ILUMINAM OBJETOS DINÂMICOS NO FUNDO.
Usar sondas de luz

Light Probes armazenam informações de iluminação preparadas sobre o espaço vazio em sua cena, ao mesmo tempo que fornecem iluminação de alta qualidade (direta e indireta). Eles usam harmônicos esféricos, que são calculados rapidamente em comparação com luzes dinâmicas. Isto é especialmente útil para objetos em movimento, que normalmente não podem receber Baked Lightmapping.

Light Probes também podem ser aplicadas a malhas estáticas. No componente Mesh Renderer , localize o menu suspenso Receber iluminação global e alterne-o de Lightmaps para Light Probes.

Continue usando Lightmapping para sua geometria de nível proeminente, mas mude para Light Probes para iluminar detalhes menores. A iluminação da Light Probe não requer UVs adequados, economizando a etapa extra de desembrulhar suas malhas. As sondas também reduzem o espaço em disco, pois não geram texturas Lightmap.

Consulte a postagem Iluminação estática com sondas de luz, bem como Criando visuais verossímeis no Unity para obter mais informações.

Obtenha o e-book gratuito

Um de nossos guias mais completos já coleta mais de 80 dicas práticas sobre como otimizar seus jogos para PC e console. Criadas por nossos engenheiros especialistas em Success and Accelerate Solutions , essas dicas detalhadas ajudarão você a aproveitar ao máximo o Unity e aumentar o desempenho do seu jogo.

Você gostou deste conteúdo?