O que você obterá nesta página: Parte II da nossa coleção de dicas úteispara otimizar seus recursos de arte para seu jogo para celular. A parte I éaqui.
Você pode encontrar muitas outras dicas de otimização móvel nestee-book abrangentee neste curso Unity Learn sobreOtimização de arte 3D para aplicativos móveis.
A mesma iluminação e materiais físicos de consoles e PCs também podem ser dimensionados para seu telefone ou tablet com o Universal Render Pipeline (URP).
Agrupe suas chamadas de sorteio
Com cada quadro, o Unity determina os objetos que devem ser renderizados e, em seguida, cria chamadas de desenho. Uma chamada draw é uma chamada à API gráfica para desenhar objetos (por exemplo, um triângulo), enquanto um lote é um grupo de chamadas draw a serem executadas juntas. O agrupamento de objetos em lote minimiza as alterações de estado necessárias para desenhar cada objeto em um lote. Isso leva a um melhor desempenho, reduzindo o custo de CPU para renderizar objetos.
- Lote dinâmico: Para malhas pequenas, o Unity pode agrupar e transformar vértices na CPU e, em seguida, desenhá-los todos de uma só vez. Observação: Use isto somente se você tiver malhas low-poly suficientes (menos de 900 atributos de vértice e não mais de 300 vértices). O Dynamic Batcher não agrupará malhas maiores do que isso, portanto, ativá-lo desperdiçará tempo de CPU procurando malhas pequenas para agrupar em cada quadro.
- Lote estático: Para geometria imóvel, o Unity pode reduzir chamadas de desenho para malhas que compartilham o mesmo material. Embora seja mais eficiente que o lote dinâmico, ele usa mais memória.
- Instanciação de GPU: Se você tiver um grande número de objetos idênticos, essa técnica os agrupará de maneira mais eficiente por meio do uso de hardware gráfico.
Lote SRP: Habilite o SRP Batcher em seu ativo URP em Avançado. Isso pode acelerar significativamente o tempo de renderização da CPU, dependendo da cena.
É crucial evitar adicionar muitas luzes dinâmicas ao seu aplicativo móvel. Considere alternativas como efeitos de sombreamento personalizados e sondas de luz para malhas dinâmicas, bem como iluminação integrada para malhas estáticas.
Consulte esta tabela de comparação de recursos para obter os limites específicos das luzes em tempo real do URP e do Built-In Render Pipeline.
A projeção de sombra pode ser desativada por MeshRenderer 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.
Adicione iluminação dramática à sua geometria estática usando Iluminação Global (GI). Marque objetos com o Contribute GI para armazenar iluminação de alta qualidade na forma de mapas de luz.
Sombras e iluminação preparadas podem então ser renderizadas sem afetar o desempenho em tempo de execução. O Lightmapper progressivo de CPU e GPU pode acelerar o cozimento da iluminação global.
Siga o manual e este artigo sobre otimização de luz para começar a usar mapeamento de luz no Unity.
Para cenas complexas com múltiplas luzes, separe seus objetos usando camadas e restrinja a influência de cada luz a uma máscara de seleção específica.
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 calculam rapidamente em comparação com luzes dinâmicas.
Uma Sonda de Reflexão pode criar reflexões realistas, mas pode ser muito cara em termos de lotes. 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.
Renderizar um objeto com transparência sempre usa mais recursos de GPU do que renderizar um objeto opaco, especialmente quando objetos transparentes são renderizados uns sobre os outros várias vezes, um processo conhecido como overdraw. É uma boa prática utilizar um material opaco sempre que possível, especialmente para plataformas móveis. Você pode verificar o overdraw usando o depurador gráfico RenderDoc .
Use o shader mais simples possível (como um shader apagado) e evite usar recursos desnecessários. Use os shaders pré-construídos do Unity projetados especificamente para sistemas como partículas. O URP inclui vários shaders leves, iluminados e apagados, que já estão otimizados para plataformas móveis. Para minimizar o overdraw, reduza o número e/ou tamanho das partículas no seu jogo.
Para objetivos de desempenho, considere usar materiais Unlit Opaque com meia precisão, quando possível, e esteja atento a operações complexas nos nós. Encontre mais dicas nesta sessão no Shader Graph.
Ao criar um shader, você pode decidir como o material reagirá à luz. A maioria dos shaders são classificados como acesos ou apagados. Um shader apagado é o modelo de sombreamento mais rápido e computacionalmente mais barato. Use-o se você estiver almejando um dispositivo de baixo custo.
Os principais pontos a serem considerados incluem:
- A iluminação não afeta um modelo de sombreamento apagado. Isto significa que muitos cálculos, como cálculos de especularidade, não são necessários. O resultado é uma renderização mais barata ou mais rápida.
- Usar uma direção de arte estilizada que lembra um desenho animado funciona bem com sombreamento apagado. Vale a pena considerar esse estilo ao desenvolver jogos para plataformas móveis.
Os sombreadores de vértice funcionam em todos os vértices, enquanto os sombreadores de pixel (ou fragmento) são executados em cada pixel. Normalmente, há mais pixels sendo renderizados do que vértices na tela. Isso significa que o pixel shader é executado com mais frequência do que o vertex shader. Por isso, recomendamos que você mova a computação do sombreador de pixel para o sombreador de vértice sempre que possível. Como de costume, depois de trabalhar nas otimizações, você deve fazer mais perfis para determinar a melhor solução para sua situação específica.
Operações básicas, como adição e multiplicação, são mais rápidas de processar. É melhor manter o número de operações matemáticas mais lentas o menor possível. A quantidade de matemática complicada usada deve ser reduzida em dispositivos mais antigos, como aqueles que usam GLES 2.0.
Ao ativar o SRP Batcher , observe a janela Estatísticas e o Gráfico de vértices da seção de renderização na visualização do Profiler. Além de um aumento no FPS, o número de triângulos e vértices processados diminui drasticamente. Como nossos objetos usam um sombreador compatível com URP, o pipeline de renderização agrupa automaticamente todos os dados geométricos relevantes para reduzir a quantidade de dados processados.
Por padrão, o Unity importa modelos animados com o Generic Rig, embora os desenvolvedores frequentemente mudem para o Humanoid Rig ao animar um personagem. Um equipamento humanóide consome de 30 a 50% mais tempo de CPU do que o equipamento genérico equivalente porque calcula a cinemática inversa e a animação redirecionando cada quadro.
Renderizar malhas com skin é caro. Certifique-se de que cada objeto que usa um SkinnedMeshRenderer exija isso. Se um GameObject precisar apenas de animação por algum tempo, use a função BakeMesh para congelar a malha com skin em uma pose estática e, em seguida, troque para um MeshRenderer mais simples em tempo de execução.
Destinado principalmente a personagens humanóides, o sistema Mecanim do Unity é bastante sofisticado, mas é frequentemente usado para animar valores únicos (por exemplo, o canal alfa de um elemento da UI). Evite o uso excessivo de animadores. Particularmente em conjunto com elementos de UI, considere criar funções de interpolação ou usar uma biblioteca de terceiros para animações simples (por exemplo, DOTween ou LeanTween).
Trabalhe com um orçamento de tempo específico por quadro
Cada quadro terá um orçamento de tempo com base nos quadros por segundo (fps) desejados. Idealmente, um aplicativo rodando a 30 fps permitirá aproximadamente 33,33 ms por quadro (1000 ms/30 fps). Da mesma forma, uma meta de 60 fps deixa 16,66 ms por quadro.
Os dispositivos podem exceder esse orçamento por curtos períodos de tempo (por exemplo, para cenas ou sequências de carregamento), mas não por um período prolongado.
Predefinições
Não confie nas configurações padrão. Use a guia de substituição específica da plataforma para otimizar recursos como texturas e geometria de malha. Configurações incorretas podem gerar tamanhos de compilação maiores, tempos de compilação mais longos e uso insuficiente de memória. Considere usar o recurso Predefinições para ajudar a personalizar as configurações básicas que aprimorarão um projeto específico.
Limite o uso de câmeras
Cada câmera incorre em alguma sobrecarga, esteja ela realizando um trabalho significativo ou não. Use apenas os componentes da câmera necessários para renderização. Em plataformas móveis de baixo custo, cada câmera pode usar até 1 ms de tempo de CPU.
Evite efeitos de tela cheia
Os efeitos de pós-processamento em tela cheia, como brilhos, podem diminuir drasticamente o desempenho. Use-os com cautela na direção de arte do seu título.
Tenha cuidado com Renderer.material
Acessar Renderer.material em scripts duplica o material e retorna uma referência para a nova cópia. Isso quebra qualquer lote existente que já inclua o material. Se você deseja acessar o material do objeto em lote, use Renderer.sharedMaterial .