
Introdução
Quando fazemos jogos, muitas vezes esquecemos um dos aspectos mais importantes do desenvolvimento de jogos - a otimização. Como resultado, temos lags e baixos FPS (às vezes até em dispositivos de última geração, se tudo estiver realmente funcionando). A maioria das pessoas sempre verá a otimização do jogo como a última etapa, e este é o primeiro erro - deve ser sempre o primeiro item da lista.
É impossível superestimar o hábito com cada construção, todos os dias quando você adiciona uma nova mecânica ou uma nova configuração de iluminação, ou quaisquer sistemas baseados na física para seus jogos, sempre verifique a construção para ver se há algum problema de desempenho devido a estes mudança é uma boa prática de desenvolvimento de jogos.
Se você não reservar um tempo para otimizar o desempenho desde o início do projeto, isso pode acabar em problemas para você e para o seu jogo nos estágios finais. Aqui, quero compartilhar algumas idéias e dicas sobre como você pode melhorar o desempenho do seu jogo com base em algumas lições práticas que aprendi com meus erros nos últimos 5 anos.
Perfil do seu jogo
O Profiler é o primeiro da lista e uma das minhas ferramentas favoritas de todos os tempos no Unity para monitorar o desempenho do jogo a fim de descobrir o que realmente está causando problemas de desempenho. É muito útil para obter uma compreensão detalhada de como seu jogo responde a várias mudanças no editor.

Você pode encontrar o Profiler em Window-> Analysis-> Profiler.
Ele exibe categorias como uso de CPU e GPU, renderização, física, áudio e muito mais. Não podemos confiar na criação de perfil no Editor (Editor de Perfil), pois o editor afeta o desempenho do projeto durante o teste e isso pode afetar a validade das informações de criação de perfil. Para obter dados de perfil precisos, é melhor criar um build separado.
Perfil remoto
Para fazer isso funcionar, você precisa instalar o Android SDK e conectar o JDK e a depuração USB. Lembre-se, é sempre uma boa ideia testar o desempenho do seu jogo no que diz respeito à mecânica, escala da IU e assim por diante. Sem mencionar o teste de desempenho do jogo real junto com os itens acima. Para testar o desempenho real do jogo, você precisa criar uma construção de perfil personalizada.

Para conectar o Remote Profiler, vá para Edit> Project Settings> Editor e na seção Device selecione Any Android Device.
Criação de perfil
Para garantir que o Unity tenha acesso à sua compilação que pode ser perfilada, você deve habilitar “Compilação de desenvolvimento ou Suporte de Profiling Profundo” e “Auto-conectar Profiler” nas configurações de compilação antes de criá-la. Isso permite que o editor do Unity vincule automaticamente sua construção.

Quando seu lance estiver pronto, abra seu jogo sem fechar a janela do Unity Profiler. O Unity agora exibirá automaticamente os dados de desempenho da versão atual do jogo na janela do criador de perfil.
Você pode descobrir mais sobre o criador de perfil aqui .
Batching GameObjects
O batching é uma técnica muito boa para melhorar o desempenho reduzindo o número de chamadas Draw, que agrupa a renderização de vários GameObjects semelhantes em uma única chamada draw. Existem dois tipos de métodos de envio em lote: estático e dinâmico. Existem algumas limitações para o lote - não podemos processar em lote malhas com pele, tecidos e alguns componentes de renderização.
Lote estático
O lote estático é usado sempre que GameObjects são estáticos. Esses GameObjects estáticos não devem se mover, escalar ou girar e devem usar o mesmo material para todos os GameObjects estáticos para que o batching funcione.
Se seus GameObjects não interagem com seu Player, ou se você não está mudando Transform, então é melhor usar lotes estáticos para a maioria dos ambientes em seu jogo, como edifícios, estradas, etc.

Lote dinâmico
O lote dinâmico é semelhante ao estático no sentido de que GameObjects deve usar os mesmos materiais, mas pode agrupar objetos em movimento sem ter que torná-los estáticos. Basicamente, o Unity pode carregar GameObjects automaticamente na mesma chamada de sorteio se eles usarem o mesmo material, mas eles têm algumas das restrições de lote dinâmico impostas a eles de acordo com o Unity:
- O batching GameObjects dinâmicos tem uma certa sobrecarga por vértice, então batching é aplicado apenas a malhas com não mais que 300 vértices e não mais que 900 atributos de vértice.
- Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
- : .
- GameObject- , transform (, GameObject A +1 GameObject B –1 ).
- Material , GameObject- , . Shadow Caster.
- : / . , GameObject- .
- Multi-pass .
- Unity , . « » .
- Legacy Deferred ( ) , GameObject .
O batching dinâmico funciona de maneira diferente para sistemas de partículas, linhas de renderização e renderização de trilha do que para malhas.
- Para cada tipo de renderizador compatível, o Unity coleta todo o conteúdo do lote em 1 grande buffer de vértice.
- O renderizador define o estado do material do lote.
- O Unity liga o buffer de vértice ao dispositivo gráfico.
- Para cada renderizador no lote, o Unity atualiza o deslocamento no Vertex Buffer e então envia uma nova chamada de desenho.
Existem outras maneiras de melhorar o envio em lote usando alguns ativos do Assetstore como Simple Mesh Combine, Bakery ou também podemos usar
Mesh.CombineMeshes
para combinar várias malhas em uma, o que é ideal para otimizar o desempenho.
Asse sua iluminação
Grosso modo, existem três modos de iluminação: Realtime, Baked e Mixed.
O tempo real é o melhor, MAS você tem que pagar por isso com desempenho. Ele traz luz direta para a cena e atualiza todos os quadros conforme as luzes e os objetos do jogo se movem dentro da cena, atualizando a iluminação imediatamente.
Sempre que você tiver a opção de assar a iluminação em um palco, certifique-se de usá-la, pois é ideal para ganhos de produtividade, especialmente se seu objetivo for dispositivos móveis. É sempre melhor usar pouca luz no palco para obter a aparência desejada.

Desta forma, todas as suas luzes serão pré-calculadas offline em um processo chamado Lightmap Baking. Quando você define o GameObject Lightmap Static Flag, o Unity transforma informações sobre GameObject Light, sombras, luzes refletidas e sombras suaves em texturas que tocam sua cena. No entanto, Lightmaps tem algumas limitações, a iluminação não pode ser atualizada dinamicamente para os objetos que você selecionar com o Lightmap Static Flag.


Fiz uma cena SCIFI há alguns meses nas minhas horas vagas e acho que este é o melhor exemplo de como funciona a iluminação cozida. Claro que usei Emissão.
Se alguém estiver interessado em uma visão geral de como essa cena SCIFI foi criada e como consegui esse visual, diga-me, talvez eu possa dedicar um artigo separado a isso.
, !
Esta é uma ótima maneira de melhorar o desempenho do seu jogo com a oclusão Unity. Em geral, Occlusion Culling significa que o Unity não exibirá GameObjects que estão completamente ocultos da perspectiva da câmera (ocluídos) por outros GameObjects.

Para abrir a janela Oclusão, vá para Window-> Rendering-> Occlusion Culling

Se alguém estiver interessado em como eu consegui esse visual na cena da Floresta Misteriosa, me diga, talvez eu possa escrever um artigo separado sobre isso.
Aqui está um vídeo se você estiver interessado!
twitter.com/i/status/1096336962259021824
Por padrão, o Unity aplica Frustum Culling, o que significa que ele exibe apenas a linha de visão da câmera, mostrando todos os objetos. Por exemplo, se a câmera estiver olhando para uma parede, todos os objetos atrás dessa parede também serão renderizados. Não precisamos disso de forma alguma, então precisamos adicionar Occlusion Culling à nossa cena.

É por isso que temos que usar Oclusão Culling, o que significa que a câmera irá apenas renderizar a parede sem nenhum objeto atrás dela.

Consulte Mais informação: