Materiais e sombreadores

Siga estas práticas recomendadas para otimizar o uso de materiais e sombreadores no seu jogo Android.

Os materiais e sombreadores são elementos básicos da arte 3D moderna. Os jogos 3D que funcionam bem no maior número de dispositivos contam com arte 3D projetada para aproveitar melhor os processadores gráficos. Este guia destaca as otimizações e as práticas recomendadas para materiais e sombreadores em dispositivos móveis para que seu jogo tenha um melhor desempenho e consumo de bateria.

Partes deste artigo são baseadas em trabalhos disponibilizados pela Arm Limited e protegidos por direitos autorais.

Sombreadores para mecanismos de jogo compatíveis com dispositivos móveis

Diferentes mecanismos de jogo associam materiais e sombreadores de formas distintas. O mecanismo do Unity permite criar vários sombreadores, mas só é possível atribuir um sombreador para cada material. Por outro lado, o Unreal Engine 4 permite aplicar diferentes sombreadores a um material, dependendo da plataforma de destino.

Para ver uma definição de sombreadores e materiais, consulte as Práticas recomendadas para uso de materiais e sombreadores para artistas.

Se você estiver usando um mecanismo de jogo, como o Unity ou Unreal Engine 4, use os sombreadores integrados, que são projetados para hardwares de dispositivos móveis. Esses sombreadores contêm recursos simplificados para melhorar o desempenho do jogo nesses dispositivos. Se possível, desative os recursos que não estão sendo usados ao configurar os materiais. Esses recursos podem ser elementos como tonalidades de cores ou mapas de detalhes. Dessa forma, o mecanismo consegue omitir os recursos não utilizados do programa de sombreador final, resultando em um melhor desempenho.

Unity

O Unity inclui vários mecanismos de renderização. Em jogos modernos para dispositivos móveis, a melhor opção é o Pipeline de Renderização Universal (URP, na sigla em inglês). O URP inclui um conjunto padrão de sombreadores que ajustam a complexidade de forma automática, dependendo da plataforma de destino. O renderizador legado do Unity inclui um conjunto de sombreadores projetados para plataformas móveis. Esses sombreadores são agrupados na categoria Mobile.

Unreal Engine 4

O mecanismo Unreal escolherá o sombreador para dispositivos móveis de acordo com a plataforma de destino selecionada. A saída visual dos sombreadores para dispositivos móveis pode ser diferente dos sombreadores padrão Shader Model 5. É possível mudar o nível de renderização da visualização no editor do Unreal para simular a saída de renderização dos sombreadores para dispositivos móveis. Apesar de existirem algumas diferenças, o Unreal usa o mesmo processo para materiais em todas as plataformas. Dessa forma, os sombreadores para dispositivos móveis geralmente terão recursos visuais e comportamentos semelhantes aos dos sombreadores padrão.

Configuração da renderização da visualização em dispositivos móveis no editor do Unreal
Figura 1. Configuração da renderização da visualização em dispositivos móveis no editor do Unreal

Minimizar as amostras de textura

Jogos projetados para dispositivos móveis precisam usar o mínimo de texturas possível nos materiais. Cada textura extra exige a criação de mais amostras de texturas, o que consome a largura de banda da memória e aumenta o consumo de bateria. O Unreal Engine 4 recomenda no máximo cinco texturas de material para execução em dispositivos móveis. Até mesmo a implementação de apenas cinco amostras de texturas pode ser extremamente dispendiosa para uso geral em muitos dispositivos. As estratégias para minimizar o número de amostras de texturas incluem:

  • Usar o agrupamento de texturas para combinar texturas de um único canal. Para ver mais informações sobre essa técnica, consulte o guia de Texturas.
  • Substituir os dados de parâmetros, como aspereza ou metálico, por uma constante numérica, para que esses dados não sejam lidos como uma textura.
  • Usar sombreadores não iluminados ou um modelo de iluminação simples, de modo que seja possível omitir as texturas necessárias para dar suporte a cálculos de iluminação em modelos de iluminação mais complexos.

Desativar a iluminação quando possível

Um fator de divisão comum para sombreadores e materiais é o uso de iluminação ou a falta de iluminação. A iluminação em tempo real envolve a realização de mais cálculos no sombreador. Dependendo do tipo de sistema de iluminação implementado, pode ser necessário definir texturas para o material, o que usa mais espaço de memória e largura de banda. Para jogos para dispositivos móveis, especialmente aqueles voltados a hardwares menos potentes, é importante minimizar o uso de iluminação em tempo real para atingir um desempenho ideal. Considere projetar sua direção de arte com base em designs que funcionem bem sem iluminação em tempo real, como arte estilizada ou parecida com desenhos animados.

Comparação de um modelo renderizado com e sem iluminação
Figura 2. Exemplo de um modelo renderizado com iluminação em tempo real (à esquerda) e sem iluminação em tempo real (à direita).

Minimizar o uso de transparências

Use materiais opacos sempre que possível. Renderizar um objeto com transparência é sempre mais difícil do que renderizar um objeto opaco equivalente. O design dos hardwares gráficos de dispositivos móveis faz com que seja mais difícil renderizar transparências nesses dispositivos do que em hardwares gráficos de computadores ou consoles de jogos. Desenhar muitos objetos transparentes no jogo, principalmente quando renderizados uns sobre os outros, afeta negativamente o desempenho.

Desenhar sobre um mesmo pixel várias vezes é um problema conhecido como overdraw. Evite ter várias camadas de overdraw de transparência. Muitos jogos têm ferramentas de diagnóstico para ajudar a detectar e eliminar overdraws. Use essas ferramentas para melhorar o desempenho do jogo e identificar áreas problemáticas que reduzem o frame rate.

Exemplo da ferramenta de visualização de overdraw no editor do Unity
Figura 3. Exemplo da ferramenta de visualização de overdraw no editor do Unity.
Exemplo da ferramenta de visualização de overdraw no editor do Unreal
Figura 4. Exemplo da ferramenta de visualização de overdraw no editor do Unreal.

Usar o método Alfa adequado

Os métodos mais comuns para implementação de transparência são a mistura Alfa e o teste Alfa.

O teste Alfa deixará o material do objeto 100% opaco ou 100% transparente. É possível configurar um limite para o valor de Alfa. No Unity, esse tipo de transparência é chamado de Cutout. No Unreal Engine 4, ele é chamado de modo de mistura Masked.

A mistura Alfa permite que o material do objeto tenha uma variedade de transparências e pode fazer com que o objeto fique parcialmente transparente. O Unity chama esse tipo de transparência de Transparent. No Unreal Engine 4, ele é chamado de modo de mistura Translucent.

Comparação entre mistura Alfa e teste Alfa
Figura 5. Imagem de exemplo (à esquerda) renderizada usando a mistura Alfa (ao centro) e o teste Alfa (à direita).

A mistura Alfa geralmente resulta em uma aparência melhor do que o teste Alfa. No entanto, para alguns tipos de malhas, como folhagens, a mistura Alfa pode ter uma aparência estranha quando visualizada em movimento. Isso se deve à impressão de que as folhas e os ramos estão sendo renderizados na ordem errada. O teste Alfa minimiza esse efeito, mas aumenta o serrilhado nas bordas das folhas e dos ramos.

A mistura Alfa e o teste Alfa podem levar tempos diferentes para renderizar uma mesma malha. Nos casos em que ambos os modos resultem em uma malha com saída visual aceitável, faça uma comparação para descobrir se o desempenho de um modo é melhor que o outro.

Complexidade do sombreador de perfil

Os recursos de renderização, como amostras de texturas, iluminação e transparência, aumentam a complexidade do sombreador e diminuem o desempenho da renderização. Você pode usar ferramentas integradas aos mecanismos de jogos e ferramentas gráficas externas para avaliar a complexidade do sombreador.

O Unreal Engine 4 inclui um modo de visualização da complexidade do sombreador que apresenta estimativas de custo de renderização para os objetos na cena.

Modo de visualização da complexidade do sombreador no editor do Unreal
Figura 6. Modo de visualização da complexidade do sombreador no editor do Unreal.

Você também pode usar o recurso estatísticas dos materiais do Unreal para determinar o custo de renderização dos materiais à medida que eles são criados.

Tela das estatísticas dos materiais no editor do Unreal
Figura 7. Tela Material Stats no editor do Unreal.

Calcular o sombreador de vértice

Os cálculos de renderização dos sombreadores geralmente são divididos entre um sombreador de vértices e um sombreador de fragmentos (também conhecidos como pixels). O número de fragmentos renderizados geralmente é maior que o número de vértices. Se um cálculo dispendioso puder ser executado no sombreador de vértices, ele será executado com menos frequência do que seria no sombreador de fragmentos.

No entanto, se esses dados forem consumidos pelo sombreador de fragmentos, eles precisarão ser transmitidos do sombreador de vértices. Se a quantidade de dados transferida for muito grande, os cálculos realizados no sombreador de fragmentos poderão ter um desempenho melhor. É possível usar ferramentas de criação de perfil para avaliar o uso de blocos e determinar a localização ideal do sombreador para um conjunto de cálculos. O Unreal Engine 4 tem um recurso UVs personalizados, que pode ajudar nessa criação de perfil.

Evitar operações matemáticas dispendiosas

As operações matemáticas são usadas nos programas de sombreador para controlar o comportamento e a aparência da imagem gerada pelo sombreador. As operações mais comuns são aritmética básica, potência, função, logaritmo etc. Operações matemáticas não são iguais em termos de custo computacional. Um sombreador cheio de operações dispendiosas terá um desempenho mais lento, especialmente em dispositivos mais antigos. Exemplos de operações que são relativamente não dispendiosas:

  • Adição
  • Subtração
  • Multiplicação

Exemplos de operações mais dispendiosas:

  • Divisão
  • Funções transcendentes (sin, cos, potência, log, tan)

Definir o perfil de desempenho com frequência

Os gargalos de desempenho nem sempre são óbvios. Evite tentar presumir quais são as áreas em que os problemas se encontram. Em vez disso, use as ferramentas de criação de perfil para avaliar o desempenho da renderização. Faça testes antes e depois de qualquer otimização para avaliar com precisão o efeito gerado.