Este é o primeiro de uma série de artigos que apresenta dicas de otimização para seus projetos Unity. Use-os como um guia para executar taxas de quadros mais altas com menos recursos. Depois de experimentar essas práticas recomendadas, não deixe de conferir as outras páginas da série:
- Otimização do desempenho para gráficos de alta qualidade
- Gerenciamento do uso da GPU para jogos de PC e console
- Programação avançada e arquitetura de código
- Desempenho aprimorado da física para uma jogabilidade suave
O pipeline de ativos pode afetar drasticamente a produtividade da sua equipe e o desempenho do seu jogo. Ao trabalhar com um artista técnico experiente, sua equipe estará equipada para definir e aplicar formatos e especificações de ativos para facilitar os processos.
Não confie nas configurações padrão. Use a guia Override específica da plataforma para otimizar ativos como texturas e geometria de malha. Configurações incorretas podem gerar tamanhos de compilação maiores, tempos de compilação mais longos e desempenho ruim da GPU e uso da memória. Considere a possibilidade de usar o recurso Presets para personalizar ainda mais as configurações da linha de base do seu projeto.
Consulte este guia para obter as práticas recomendadas para trabalhar com ativos de arte. Para obter um guia específico para dispositivos móveis, confira o curso do Unity Learn sobre otimização de arte 3D para aplicativos móveis.
Nas configurações do player, desative a API de gráficos automáticos e remova as APIs de gráficos adicionais que você não planeja suportar para cada uma das plataformas de destino. Isso pode evitar a geração de variantes excessivas de shader. Desative a configuração de Arquiteturas de destino para CPUs mais antigas se o seu aplicativo não for compatível com elas.
Saiba mais sobre a API de gráficos.
Mudar o backend de scripting de Mono para IL2CPP (Intermediate Language to C++) pode proporcionar um melhor desempenho geral do tempo de execução. No entanto, isso também pode aumentar o tempo de construção. Alguns desenvolvedores preferem usar o Mono localmente para uma iteração mais rápida e, em seguida, mudar para o IL2CPP para máquinas de compilação e/ou candidatos a lançamento. Consulte a documentação Otimizando os tempos de compilação do IL2CPP para obter mais informações sobre como reduzir os tempos de compilação.
Observação: Ao usar essa opção, o Unity converte o código IL de scripts e assemblies para C++ antes de criar um arquivo binário nativo (.exe, .apk, .xap) para sua plataforma de destino.
Consulte a Introdução aos componentes internos do IL2CPP ou consulte a página do manual Opções do compilador para saber como as várias opções do compilador afetam o desempenho do tempo de execução.
Os projetos móveis devem equilibrar as taxas de quadros com a duração da bateria e a limitação térmica. Pense nos quadros por segundo (fps).
Em vez de forçar os limites de seu dispositivo a 60 fps, considere a execução a 30 fps como um meio-termo. Observe que o Unity já tem como padrão 30 fps para dispositivos móveis.
Você também pode ajustar a taxa de quadros dinamicamente durante o tempo de execução com Application.targetFrameRate. Por exemplo, você pode reduzir para menos de 30 fps em cenas lentas ou relativamente estáticas (como menus) e reservar as configurações de fps mais altas para o jogo.
As plataformas móveis não renderizam meios quadros. Mesmo que você desative o Vsync no Editor(Configurações do projeto > Qualidade), ele ainda estará ativado no nível do hardware. Se a GPU não puder atualizar com rapidez suficiente, o quadro atual será mantido e, como resultado, reduzirá seus fps.
Mais informações estão disponíveis na documentação.
O Unity sonda o acelerômetro do seu celular várias vezes por segundo. Desative-o se não estiver sendo usado em seu aplicativo ou reduza sua frequência para melhorar o desempenho.
Saiba mais sobre o acelerômetro.
Divida suas hierarquias. Se os GameObjects não precisarem ser aninhados na hierarquia, simplifique a criação de pais.
Hierarquias menores se beneficiam do multithreading para atualizar as transformações em sua cena. Hierarquias complexas geram cálculos de transformação desnecessários e custos para a coleta de lixo (GC).
Consulte Otimizando a hierarquia e esta palestra da Unite para obter dicas sobre Transforms.
Os dois exemplos acima usam o mesmo modelo e textura, mas as configurações na parte superior consomem mais de cinco vezes a memória em comparação com as da parte inferior, sem uma qualidade visual muito melhor.
A compactação de textura oferece benefícios significativos de desempenho quando aplicada corretamente, como tempos de carregamento mais rápidos, menor espaço de memória e desempenho de renderização muito maior. As texturas compactadas usam apenas uma fração da largura de banda da memória necessária para texturas RGBA de 32 bits não compactadas.
Consulte esta lista recomendada de formatos de compactação de textura para plataformas de destino.
As texturas podem usar recursos em excesso, portanto, é fundamental otimizar suas configurações de importação. Em geral, tente seguir estas diretrizes:
- Diminuir o tamanho máximo: Use as configurações mínimas que produzem resultados visualmente aceitáveis. Isso não é destrutivo e pode reduzir rapidamente sua memória de textura.
- Use potências de dois (POT): o Unity exige dimensões de textura POT para formatos de compactação de textura.
- Quando ativada, essa opção cria uma cópia na memória endereçável da CPU e da GPU, dobrando o espaço de memória da textura. Desative-o na maioria dos casos e ative-o somente se você gerar uma textura em tempo de execução que precise ser substituída. Você também pode aplicar essa opção por meio do Texture2D.Apply, passando o makeNoLongerReadable definido como True.
- Desativar Mip Maps desnecessários: os Mip Maps não são necessários para texturas que permanecem em um tamanho consistente na tela, como sprites 2D e gráficos de interface do usuário. No entanto, deixe o Mip Maps ativado para modelos 3D que variam em distância da câmera.
Saiba mais sobre as configurações de importação de textura.
Atlasing é o processo de agrupar várias texturas menores em uma única textura maior. Os Atlases de textura reduzem o uso da memória e exigem menos chamadas de desenho, diminuindo assim o esforço exigido pela GPU.
- Para projetos 2D: Use um Atlas de sprites(Asset > Create > 2D > Sprite Atlas) em vez de renderizar sprites ou texturas individuais.
- Para projetos em 3D: Você pode usar o pacote de criação de conteúdo digital (DCC) de sua preferência. Várias ferramentas de terceiros, como MA_TextureAtlasser ou TexturePacker também podem ser usadas para criar atlas de textura.
Combine texturas e remapeie UVs para qualquer geometria 3D que não exija mapas de alta resolução. Um editor visual permite que você defina e priorize os tamanhos e as posições no Texture Atlas ou Sprite Sheet.
O Texture Packer consolida os mapas individuais em uma textura grande. O Unity pode então emitir uma única chamada de desenho para acessar as texturas compactadas com uma sobrecarga de desempenho menor.
Leia mais sobre o Sprite Atlases aqui.
Os modelos de alta resolução exigem mais uso de memória e, possivelmente, mais trabalho para a GPU. Dessa forma, procure manter a complexidade geométrica dos GameObjects em suas cenas no mínimo possível. Caso contrário, o Unity terá que enviar dados significativos de vértices para a placa de vídeo.
A melhor prática é cortar os modelos no software DCC e excluir os polígonos invisíveis do ponto de vista da câmera. Por exemplo, se você nunca vê a parte de trás de um armário encostado em uma parede, o modelo não deve ter nenhuma face ali.
Esteja ciente de que, nas GPUs modernas, o gargalo geralmente está relacionado à densidade de polígonos e não à contagem de polígonos. Tente executar uma passagem de arte em todos os ativos para reduzir a contagem de polígonos de objetos distantes. Os microtriângulos podem ser uma causa significativa do baixo desempenho da GPU.
Dependendo da plataforma de destino, pense em adicionar detalhes por meio de texturas de alta resolução para compensar a geometria de baixo polígono. Use texturas e mapas normais em vez de aumentar a densidade da malha. Reduza a complexidade dos pixels incorporando o máximo possível de detalhes às texturas. Por exemplo, você pode capturar os realces especulares na própria textura para evitar o cálculo do realce no shader de fragmento.
Fique atento e lembre-se de fazer o perfil regularmente. Afinal, essas técnicas afetam o desempenho e podem não ser adequadas para sua plataforma de destino.
Assim como as texturas, as malhas podem consumir memória em excesso se não forem importadas com cuidado. Experimente estas dicas para minimizar o consumo de memória de suas malhas:
- Compressão de malha: A compactação de malha pode reduzir o espaço em disco (embora a memória em tempo de execução não seja afetada). Ao mesmo tempo, a quantização da malha pode resultar em imprecisão, portanto, experimente os níveis de compactação para ver o que funciona para seus modelos.
- Desativar leitura/gravação: a ativação dessa opção duplica a malha na memória, o que mantém uma cópia da malha na memória do sistema e outra na memória da GPU. Na maioria dos casos, você deve desativá-lo. No Unity 2019.2 e versões anteriores, essa opção está marcada por padrão.
- Desativar rigs e formas de mesclagem: Se sua malha não precisar de animação de esqueleto ou de forma mesclada, desative essas opções.
- Desativar normais e tangentes: Se você tiver certeza absoluta de que o material da malha não precisará de normais ou tangentes, desmarque essas opções para economizar ainda mais.
Outras opções de otimização de malha estão disponíveis nas Configurações do jogador:
- Vertex Compression (Compressão de v értices) define a compressão de vértices de cada canal. Por exemplo, você pode ativar a compactação para tudo, exceto posições e UVs de mapa de luz. Isso pode reduzir o uso de memória em tempo de execução de suas malhas.
- Observação: A configuração Mesh Compression (Compressão de malha) nas Import Settings (Configurações de importação) de cada malha substitui a configuração Vertex Compression (Compressão de vértice). Nesse caso, a cópia em tempo de execução da malha é descompactada e pode usar mais memória.
- O Optimize Mesh Data (Otimizar dados de malha ) remove todos os dados das malhas que não são exigidos pelo material aplicado a elas (como tangentes, normais, cores e UVs).
Ao automatizar o processo de auditoria, você pode evitar a alteração acidental das configurações de ativos. O AssetPostProcessor pode ajudá-lo a padronizar suas configurações de importação ou analisar os ativos existentes. Ele permite que você execute scripts ao importar ativos e, basicamente, solicita que você personalize as configurações antes e/ou depois de importar modelos, texturas, áudio e muito mais.
Leia mais sobre a auditoria de ativos no guia Entendendo a otimização.
O Unity usa um buffer em anel para enviar as texturas para a GPU. Você pode ajustar manualmente esse buffer de textura assíncrona por meio de QualitySettings.asyncUploadBufferSize.
Se a taxa de carregamento estiver muito lenta ou se o thread principal travar ao carregar várias texturas de uma vez, ajuste esses buffers de textura. Normalmente, você pode definir o valor (em MB) como o tamanho da maior textura que precisa carregar na cena.
Lembre-se de que a alteração dos valores padrão pode levar a uma alta pressão na memória. Além disso, você não pode devolver a memória do buffer de anel ao sistema depois que o Unity a aloca. Se a memória da GPU estiver sobrecarregada, a GPU descarregará a textura mais recente e menos usada e forçará a CPU a recarregá-la na próxima vez que entrar na frustração da câmera.
Explore todas as restrições de memória para buffers de textura no tutorial Gerenciamento de memória e consulte Otimização do desempenho de carregamento para ver como você pode melhorar o tempo de carregamento.
O mapa Mip Map Streaming oferece controle sobre quais níveis do Mip Map devem ser carregados na memória. Ative-o acessando as configurações de qualidade do Unity(Edit > Project Settings > Quality) e marque a opção Texture Streaming. Você pode ativar o Streaming Mip Maps nas Configurações de importação de textura em Avançado.
Esse sistema reduz a quantidade total de memória necessária para texturas porque carrega apenas os Mip Maps necessários para renderizar a posição atual da câmera. Caso contrário, o Unity carrega todas as texturas por padrão.
O streaming de textura troca uma pequena quantidade de recursos da CPU para economizar uma quantidade potencialmente grande de memória da GPU. Ele também reduz automaticamente os níveis do Mip Map para permanecer dentro do orçamento de memória definido pelo usuário.
Você pode usar a API Mip Map Streaming para obter mais controle.
O Sistema de Ativos Endereçáveis simplifica o gerenciamento dos ativos que compõem seu jogo. Qualquer ativo, incluindo cenas, Prefabs, ativos de texto e assim por diante, pode ser marcado como endereçável e receber um nome exclusivo. Você pode então chamar esse alias de qualquer lugar.
A adição desse nível extra de abstração entre o jogo e seus recursos pode simplificar determinadas tarefas, como a criação de um pacote de conteúdo separado para download. Os endereçáveis também facilitam a referência a esses pacotes de ativos, sejam eles locais ou remotos.
Instale o pacote Addressables no Package Manager. Como resultado, cada ativo ou pré-fabricado do projeto pode se tornar "endereçável".
Marcar a opção sob o nome de um ativo no Inspetor atribui a ele um endereço padrão e exclusivo. Uma vez marcados, os ativos correspondentes aparecem na janela Janela > Gerenciamento de ativos > Endereçáveis > Grupos .
Independentemente de o ativo estar hospedado em outro local ou armazenado localmente, o sistema o localizará usando a cadeia de caracteres Addressable Name. Um Prefab endereçável não é carregado na memória até que seja necessário e, em seguida, descarrega automaticamente seus ativos associados quando não estiver mais em uso. Esta postagem do blog sobre Como economizar memória com Addressables demonstra como você pode organizar seus Addressable Groups para ser mais eficiente com a memória.
Consulte Addressables: Introdução aos conceitos para uma rápida visão geral de como o Addressable Asset System pode funcionar em seu projeto.
Um dos nossos guias mais abrangentes reúne mais de 80 dicas práticas sobre como otimizar seus jogos para PC e console. Criadas por nossos engenheiros especializados em Success e Accelerate Solutions, essas dicas detalhadas o ajudarão a aproveitar ao máximo o Unity e a aumentar o desempenho do seu jogo.