
Este é o segundo de uma série de artigos que descompacta dicas de otimização para seus projetos Unity. Use-os como um guia para rodar em taxas de quadros mais altas com menos recursos. Depois de experimentar essas melhores práticas, não deixe de conferir as outras páginas da série:
Veja nossos últimos guias de otimização para desenvolvedores e artistas do Unity 6:
As ferramentas gráficas do Unity permitem que você crie gráficos otimizados em qualquer estilo, em uma variedade de plataformas – de dispositivos móveis a consoles de alta qualidade e desktop. Esse processo geralmente depende da sua direção artística e do pipeline de renderização, então, antes de começar, recomendamos revisar os Pipelines de renderização disponíveis.
Otimizar a iluminação da cena não é uma ciência exata, mas sim um processo iterativo. Envolve tentativa e erro e o processo geralmente depende da direção artística e do pipeline de renderização.
Antes de começar a iluminar suas cenas, você precisará escolher um dos pipelines de renderização disponíveis. Um pipeline de renderização realiza uma série de operações que levam o conteúdo de uma cena para exibi-lo na tela.
Unity fornece três pipelines de renderização pré-construídos com diferentes capacidades e características de desempenho, ou você pode criar o seu próprio.
1. O Pipeline de Renderização Universal (URP) é um Pipeline de Renderização Scriptável (SRP) pré-construído. URP fornece fluxos de trabalho amigáveis para artistas para criar gráficos otimizados em uma variedade de plataformas, desde dispositivos móveis até consoles e PCs de alto desempenho. URP é o sucessor do Pipeline de Renderização Integrado, fornecendo recursos de gráficos e renderização indisponíveis com o pipeline mais antigo. Para manter o desempenho, ele faz concessões para reduzir o custo computacional de iluminação e sombreamento. Escolha URP se você quiser alcançar a maioria das plataformas-alvo, incluindo dispositivos móveis e VR.
Obtenha uma visão geral completa das capacidades do URP no e-book Introdução ao Pipeline de Renderização Universal para criadores avançados do Unity (edição Unity 6).
2. O Pipeline de Renderização de Alta Definição (HDRP) é outro SRP pré-construído projetado para gráficos de ponta e alta fidelidade. HDRP foca em hardware de alto desempenho, como PC, Xbox e PlayStation. É o pipeline de renderização recomendado para criar gráficos fotorealistas com o mais alto nível de realismo em seu jogo, com iluminação avançada, reflexos e sombras. O HDRP usa iluminação e materiais baseados fisicamente e suporta ferramentas de depuração aprimoradas.
Obtenha uma visão completa das capacidades do HDRP no e-book Iluminação e ambientes no Pipeline de Renderização de Alta Definição.
3. O Pipeline de Renderização Integradoé o pipeline de renderização mais antigo e de uso geral da Unity, com personalização limitada. Este pipeline continuará a ser suportado ao longo do ciclo Unity 6.x.

Na renderização forward, a placa gráfica projeta a geometria e a divide em vértices. Esses vértices são ainda mais divididos em fragmentos, ou pixels, que são renderizados na tela para criar a imagem final.
O pipeline passa cada objeto, um de cada vez, para a API gráfica. A renderização forward tem um custo para cada luz. Quanto mais luzes em sua cena, mais tempo a renderização levará.
O renderizador forward do Pipeline Integrado desenha cada luz em uma passagem separada por objeto. Se você tiver várias luzes atingindo o mesmo GameObject, isso pode criar um grande overdraw, onde áreas sobrepostas precisam desenhar o mesmo pixel mais de uma vez. Minimize o número de luzes em tempo real para reduzir o overdraw.
Em vez de renderizar uma passagem por luz, o URP elimina as luzes por objeto. Isso permite que a iluminação seja computada em uma única passagem, resultando em menos chamadas de desenho em comparação com o renderizador forward do Pipeline Integrado.
Forward +
Renderização Forward+ melhora a renderização Forward padrão ao eliminar luzes espacialmente em vez de por objeto. Isso aumenta o número total de luzes que podem ser utilizadas na renderização de um quadro. Na renderização diferida, suporta a API Native RenderPass, permitindo que os passes G-buffer e de iluminação sejam combinados em um único passe de renderização.

Na sombreamento diferido, a iluminação não é calculada por objeto.
O sombreamento diferido, em vez disso, adia o cálculo da iluminação - para uma fase posterior. O sombreamento diferido usa dois passes.
No primeiro passe, ou o passe de geometria G-Buffer, o Unity renderiza os GameObjects. Este passe recupera vários tipos de propriedades geométricas e as armazena em um conjunto de texturas. As texturas do G-buffer podem incluir:
No segundo passe, ou passe de iluminação, o Unity renderiza a iluminação da cena com base no G-buffer. Imagine iterar sobre cada pixel e calcular as informações de iluminação com base no buffer em vez dos objetos individuais. Assim, adicionar mais luzes que não projetam sombras no sombreamento diferido não acarreta a mesma perda de desempenho que na renderização 'forward'.
Embora escolher um caminho de renderização não seja uma otimização em si, pode afetar como você otimiza seu projeto. As outras técnicas e fluxos de trabalho nesta seção podem variar dependendo de qual pipeline de renderização e qual caminho de renderização você escolheu.

Tanto o HDRP quanto o URP suportam Shader Graph, uma interface visual para criação de shaders. Isso permite que alguns usuários criem efeitos de sombreamento complexos que podem ter estado fora de alcance anteriormente. Use os mais de 150 nós no sistema de gráfico visual para criar mais shaders. Você também pode criar seus próprios nós personalizados com a API.
Comece cada Shader Graph com um nó mestre compatível, que determina a saída do gráfico. Adicione nós e operadores com a interface visual e construa a lógica do shader.
Este Shader Graph então passa para o backend do pipeline de renderização. O resultado final é um shader ShaderLab, funcionalmente semelhante a um escrito em HLSL ou Cg.
Otimizar um Shader Graph segue muitas das mesmas regras que se aplicam a Shaders HLSL/Cg tradicionais. Quanto mais processamento seu Shader Graph fizer, mais isso impactará o desempenho de sua aplicação.
Se você estiver limitado pela CPU, otimizar seus shaders não melhorará a taxa de quadros, mas pode ainda melhorar a vida útil da bateria em plataformas móveis.
Se você estiver limitado pela GPU, siga estas diretrizes para melhorar o desempenho com Shader Graphs:
- Reduza seus nós: Remova nós não utilizados. Não mude nenhum padrão ou conecte nós a menos que essas mudanças sejam necessárias. O Shader Graph compila automaticamente quaisquer recursos não utilizados. Quando possível, asse valores em texturas. Por exemplo, em vez de usar um nó para clarear uma textura, aplique o brilho extra no próprio ativo de textura.
- Use um formato de dados menor: Mude para uma estrutura de dados menor quando possível. Considere usar Vector2 em vez de Vector3 se isso não impactar seu projeto. Você também pode reduzir a precisão se a situação permitir (por exemplo, half em vez de float).
- Reduzir operações matemáticas: As operações de shader são executadas muitas vezes por segundo, então otimize qualquer operador matemático quando possível. Tente misturar resultados em vez de criar um ramo lógico. Use constantes e combine valores escalares antes de aplicar vetores. Por fim, converta quaisquer propriedades que não precisam aparecer no Inspector em Nós em linha. Todos esses incrementos de velocidade podem ajudar seu orçamento de quadros.
- Ramo de uma pré-visualização: À medida que seu gráfico fica maior, pode se tornar mais lento para compilar. Simplifique seu fluxo de trabalho com um ramo separado e menor que contenha apenas as operações que você deseja pré-visualizar no momento, e então itere mais rapidamente nesse ramo menor até alcançar os resultados desejados.
Se o ramo não estiver conectado ao nó mestre, você pode deixar o ramo de pré-visualização em seu gráfico com segurança. Unity remove nós que não afetam a saída final durante a compilação.
- Otimizar manualmente: Mesmo que você seja um programador gráfico experiente, ainda pode usar um Shader Graph para estabelecer algum código padrão para um shader baseado em script. Selecione o ativo Shader Graph, em seguida, selecione Copiar Shader no menu de contexto.
Crie um novo Shader HLSL/Cg e cole o Shader Graph copiado. Esta é uma operação unidirecional, mas permite que você extraia desempenho adicional com otimizações manuais.

Remova todos os shaders que você não usa da lista de shaders Sempre Incluídos nas Configurações Gráficas (Editar > Configurações do Projeto > Gráficos). Adicione shaders aqui que você precisará durante a vida útil da aplicação.

Os variantes de shader podem ser úteis para recursos específicos de plataforma, mas aumentam os tempos de compilação e o tamanho do arquivo.
Você pode usar as diretivas de pragma de compilação de shader para compilar o shader de forma diferente para plataformas-alvo. Em seguida, use uma palavra-chave de shader (ou o nó de palavra-chave do Shader Graph) para criar variantes de shader com certos recursos ativados ou desativados.
Você pode evitar que variantes de shader sejam incluídas em sua compilação se souber que não são necessárias.
Analise o Editor.log para tempos e tamanhos de shader. Localize as linhas que começam com “Shader compilado” e “Shader comprimido.” Em um log de exemplo, seu shader TEST pode mostrar:
Shader compilado 'TEST Standard (Configuração Especular)' em 31.23s
d3d9 (programas internos totais: 482, únicos: 474)
d3d11 (programas internos totais: 482, únicos: 466)
metal (programas internos totais: 482, únicos: 480)
glcore (programas internos totais: 482, únicos: 454)
Shader comprimido 'TEST Standard (Configuração Especular)' em d3d9 de 1.04MB para 0.14MB
Shader comprimido 'TEST Standard (Configuração Especular)' em d3d11 de 1.39MB para 0.12MB
Shader comprimido 'TEST Standard (Configuração Especular)' em metal de 2.56MB para 0.20MB
Shader comprimido 'TEST Standard (Configuração Especular)' em glcore de 2.04MB para 0.15MB
Isso lhe diz algumas coisas sobre este shader:
- O shader se expande em 482 variantes devido a #pragma multi_compile e shader_feature.
- Unity comprime o shader incluído nos dados do jogo para aproximadamente a soma dos tamanhos comprimidos: 0.14+0.12+0.20+0.15 = 0.61MB.
- Em tempo de execução, Unity mantém os dados comprimidos na memória (0.61MB), enquanto os dados para sua API gráfica atualmente utilizada estão descomprimidos. Por exemplo, se sua API atual for Metal, isso representaria 2.56MB.
Após uma construção, Project Auditor pode analisar o Editor.log para exibir uma lista de todos os shaders, palavras-chave de shader e variantes de shader compiladas em um projeto. Ele também pode analisar o Player.log após o jogo ser executado. Isso mostra quais variantes a aplicação realmente compilou e usou em tempo de execução.
Utilize essas informações para construir um sistema de remoção de shader scriptável e reduzir o número de variantes. Isso pode melhorar os tempos de construção, tamanhos de construção e uso de memória em tempo de execução.
Leia o post do blog Stripping scriptable shader variants para ver esse processo em detalhes.
Anti-aliasing ajuda a suavizar a imagem, reduzir bordas irregulares e minimizar o aliasing especular.
Se você estiver usando renderização Forward com o Built-in Render Pipeline, Multisample Anti-aliasing (MSAA) está disponível nas Configurações de qualidade. MSAA produz anti-aliasing de alta qualidade, mas pode ser caro. A Contagem de amostras MSAA do menu suspenso (Nenhum, 2X, 4X, 8X) define quantas amostras o renderizador usa para avaliar o efeito.
Se você estiver usando renderização Forward com o URP ou HDRP, pode habilitar MSAA no Asset do Render Pipeline.
Alternativamente, você pode adicionar anti-aliasing como um efeito de pós-processamento. Isso aparece no componente da Câmera sob Anti-aliasing:
- Anti-aliasing aproximado rápido (FXAA) suaviza as bordas em nível de pixel. Este é o anti-aliasing menos intensivo em recursos e desfoca ligeiramente a imagem final.
- Anti-aliasing morfológico subpixel (SMAA) mescla pixels com base nas bordas de uma imagem. Isso tem resultados muito mais nítidos do que FXAA e é adequado para estilos de arte planos, semelhantes a desenhos animados ou limpos.
No HDRP, você também pode usar FXAA e SMAA com a configuração Anti-aliasing Pós na Câmera. URP e HDRP também oferecem uma opção adicional:
- Anti-aliasing temporal (TAA) suaviza as bordas usando quadros do buffer de histórico. Isso funciona de forma mais eficaz do que FXAA, mas requer vetores de movimento para funcionar. TAA também pode melhorar a oclusão ambiental e volumétricos. Geralmente é de qualidade superior ao FXAA, mas consome mais recursos e pode produzir artefatos de fantasmas ocasionais.

O Pós-processamento Espacial-Temporal (STP) é projetado para melhorar a qualidade visual em uma ampla gama de plataformas, como dispositivos móveis, consoles e PCs. STP é um upscaler de anti-aliasing espaço-temporal que funciona com os pipelines de renderização HDRP e URP, oferecendo escalonamento de conteúdo de alta qualidade sem a necessidade de alterações no conteúdo existente. Esta solução é particularmente otimizada para desempenho de GPU, garantindo tempos de renderização mais rápidos e facilitando a obtenção de alto desempenho enquanto mantém a qualidade visual.
Para habilitar o STP no URP:
- Selecione o Ativo URP ativo na janela do Projeto.
- No Inspetor, navegue até Qualidade > Filtro de Upscaling e selecione Pós-processamento Espacial-Temporal.

A opção mais rápida para criar iluminação é aquela que não precisa ser calculada a cada quadro. Para fazer isso, use Iluminação Global para "assar" 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 objetos com Contribuir GI para que você possa armazenar iluminação de alta qualidade na forma de lightmaps.
O processo de gerar um ambiente com mapeamento de luz leva mais tempo do que apenas colocar uma luz na cena no Unity, mas isso:
- Executa mais rápido, 2-3 vezes mais rápido para luzes de dois pixels por luz
- Fica melhor – GI pode calcular iluminação direta e indireta com aparência realista. O lightmapper suaviza e remove ruídos do mapa resultante.
Sombras e iluminação assadas podem ser renderizadas sem a mesma perda de desempenho da iluminação e sombras em tempo real.
Cenas complexas podem exigir longos tempos de cozimento. Se seu hardware suportar o Progressive GPU Lightmapper, esta opção pode acelerar dramaticamente a geração do seu lightmap, até dez vezes em alguns casos.
Siga este guia para começar com Lightmapping no Unity.

Um componente Reflection Probe pode criar reflexos realistas, mas isso pode ser muito custoso em termos de lotes. Use cubemaps de baixa resolução, máscaras de culling e compressão de textura para melhorar o desempenho em tempo de execução. Use Tipo: Assado para evitar atualizações por quadro.
Se usar Tipo: Em Tempo Real é necessário no URP, evite Every Frame se possível. Ajuste o Modo de Atualização e as configurações de Divisão de Tempo para reduzir a taxa de atualização. Você também pode controlar a atualização com a opção Via Scripting e renderizar a sonda a partir de um script personalizado.
Se usar Tipo: Em Tempo Real é necessário no HDRP, use o modo On Demand. Você também pode modificar as Configurações de Quadro em Configurações do Projeto > Configurações Padrão do HDRP. Reduza a qualidade e os recursos em Reflexão em Tempo Real para melhorar o desempenho.
Reduza a qualidade e os recursos sob Reflexão em Tempo Real para melhorar o desempenho.

Unity 6 introduz Volumes de Probes Adaptativos (APVs) que fornecem uma solução sofisticada para lidar com iluminação global no Unity, permitindo iluminação dinâmica e eficiente em cenas complexas. Os APVs podem otimizar tanto o desempenho quanto a qualidade visual, particularmente em dispositivos móveis e de baixo desempenho, enquanto oferecem capacidades avançadas para plataformas de alto desempenho.
Os APVs oferecem uma variedade de recursos para melhorar a iluminação global, particularmente em cenas dinâmicas e grandes. O URP agora suporta amostragem por vértice para melhorar o desempenho em dispositivos de baixo desempenho, enquanto partículas VFX se beneficiam da iluminação indireta embutida em volumes de probes.
Os dados do APV podem ser transmitidos do disco para a CPU e GPU, otimizando as informações de iluminação para grandes ambientes. Os desenvolvedores podem assar e misturar múltiplos cenários de iluminação, permitindo transições em tempo real como ciclos dia/noite. O sistema também suporta oclusão do céu, integra-se com a API Ray Intersector para cálculos de probes mais eficientes e oferece controle sobre a densidade de amostras de Light Probe para reduzir vazamentos de luz e acelerar iterações. A nova API de assar em C# também permite a assadura independente de APV de lightmaps ou probes de reflexão.
Para começar a usar APVs, confira a palestra Iluminação eficiente e impactante com Volumes de Probes Adaptativos da GDC 2023.

A projeção de sombras pode ser desativada por MeshRenderer e luz. Desative sombras sempre que possível para reduzir chamadas de desenho.
Você também pode criar sombras falsas usando uma textura borrada aplicada a uma malha simples ou quad abaixo de seus personagens. Caso contrário, você pode criar sombras de blob com shaders personalizados.
Em particular, evite habilitar sombras para luzes pontuais. Cada luz pontual com sombras requer seis passes de mapa de sombras por luz – compare isso com um único passe de mapa de sombras para uma luz de foco. Considere substituir luzes pontuais por luzes de foco onde sombras dinâmicas são absolutamente necessárias. Se você puder evitar sombras dinâmicas, use um cubemap como um Light.cookie com suas luzes pontuais em vez disso.

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 de contorno, use um Shader que simula a iluminação de contorno (veja Exemplos de Shader de Superfície para uma implementação disso em HLSL).
Para cenas complexas com muitas luzes, separe seus objetos usando camadas, depois restrinja a influência de cada luz a uma Máscara de Culling específica.

O GPU Lightmapper está pronto para produção no Unity 6. Ele acelera dramaticamente a geração de dados de iluminação aproveitando a GPU, oferecendo tempos de bake significativamente mais rápidos em comparação com o lightmapping tradicional da CPU. Ele introduz um novo backend de baking de luz que simplifica a base de código e fornece resultados mais previsíveis. Além disso, o requisito mínimo da GPU foi reduzido para 2GB, e também inclui uma nova API para mover posições de sondas de luz em tempo de execução, o que é particularmente útil para conteúdo gerado proceduralmente, juntamente com várias melhorias na qualidade de vida.


Você pode encontrar muitas mais melhores práticas e dicas para desenvolvedores e criadores avançados do Unity no hub de melhores práticas do Unity. Escolha entre mais de 30 guias, criados por especialistas da indústria, engenheiros e artistas técnicos do Unity, que ajudarão você a desenvolver de forma eficiente com as ferramentas e sistemas do Unity.