Como otimizar jogos na Unity usando o MeshCombines
3 de maio de 2020. Esse foi o dia que meu computador quebrou.
E porque estou te contando isso?
Porque eu fiquei 2 semanas sem poder mexer nele, com isso eu tive que deixar meus jogos de lado.
Mas como eu não consigo ficar longe desse mundo por muito tempo eu fui me aventurar em pesquisar sobre otimização de jogos lá na gringa.
E sabe o que eu descobri?
Eles manjam de coisas que nós não fazemos nem ideia!
Uma dessas coisas é uma ferramenta da Unity chamada Mesh Combines. Ela é uma ótima opção para você fazer jogos com mapas muito grandes.
Como jogos procedurais ou jogos de mundo aberto.
E hoje eu quero te contar toda a experiência que eu tive testando essa ferramenta.
1 – O que é o MeshCombines?
2 – Como usar o MeshCombines?
3 – Otimizando o script
4 – Alguns pontos importantes
O que é o MeshCombines?
Primeiro eu preciso te explicar o que é o mesh combines.
Ele é uma ferramenta que combina meshes em uma cena. Nada mais que isso.
E porque isso é bom?
Existe um número que a Unity fornece para nós que são os Batches.
Batches é uma métrica para medir o quanto nós estamos usando do processador.
O processador é responsável por calcular os objetos na cena para a placa de vídeo renderizar.
Logo, se nós temos muitos Meshes na cena, teremos um número de Batches elevado e consequentemente teremos um número de FPS muito pequeno.
Nessa imagem a baixo eu irei te mostrar a quantidade de Batches na mesma cena sem e com o Mesh Combines.
Percebe que é desleal a comparação, fomos de 18724 Batches para 82 e isso dá um aumento de 228,34x rendimento.
Como implementar o MeshCombines?
O mesh combines é usado através de um script que pode ser encontrado na biblioteca da Unity.
Eu irei te explicar todo o script, mas antes disso eu preciso te explicar o que você precisa fazer para implementar esse sistema.
A primeira coisa que você vai fazer na cena é criar um Empty.
É dentro desse objeto que vamos colocar todos os objetos que você quer juntar os Meshes, mas antes disso precisamos fazer algumas coisas.
A primeira coisa é colocar a posição no (0,0,0).
A rotação do empty no (0,0,0).
E o Scale no (1,1,1)
Agora iremos adicionar 3 componentes nesse empty
Um Mesh Collider, um mesh filter
e um mesh renderer
Depois disso é só você colocar todos os objetos que você quer combinar dentro do empty.
E agora vamos criar um script e eu irei te ensinar o que ele faz.
Entendendo e otimizando o script
Aqui embaixo temos o script que a Unity nos fornece. using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { /*Lembra que eu te falei para colocar os objetos dentro do empty? essa função GetComponentsInChildren serve para nós pegarmos todos os componentes que nós queremos que estão como filhos desse objeto e coloca todos eles em uma lista*/ MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; /*Agora o que esse script vai fazer é pegar todas as informações que o CombineInstance precisa de dentro da lista do MeshFilter para nós podermos combinar esses objetos. Ele ainda desativa os objetos que estão dentro da lista do MeshFilter porque nós não vamos mais precisar deles */ int i = 0; while (i < meshFilters.Length) { combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = meshFilters[i].transform.localToWorldMatrix; meshFilters[i].gameObject.SetActive(false); i++; } /*Agora basta usar a função mesh.CombineMeshes e para isso o Script pega o MeshFilter do empty e cria um novo mesh.*/ transform.GetComponent<MeshFilter>().mesh = new Mesh(); transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine); /*O Script ainda ativa o empty mas se ele já esta ativado não precisa.*/ transform.gameObject.SetActive(true); /*Aqui temos uma otimização importante desse script que não esta no Script da Unity. Nós iremos criar o MeshCollider a partir do mesh que nós combinamos*/ transform.GetComponent<MeshCollider>().sharedMesh = transform.GetComponent<MeshFilter>().mesh; } } Depois de tudo isso não se esqueça de colocar o script dentro do empty.
Alguns pontos importantes
Aqui eu tenho que fazer 2 parênteses, esse script só funciona com materiais únicos e iguais.
É importante para usar ele você definir quantos materiais vão ser usados no seu jogo e separar os objetos por materiais.
Então você vai criar um empty para cada material e dentro dos objetos só pode conter um material.
Temos também um limite de objetos que podem ser combinados sem a Unity bugar o seu mesh na hora de combinar.
Esse número é bem grande, mas se você for juntar muitos objetos pode acontecer isso.
Não existe um número exato para isso, depende da complexidade dos objetos que você vai combinar.
Então a melhor forma de você descobrir é testando.
A partir do momento que você ver que esta bugando o seu mesh, você cria outro empty com o mesmo material e começa a colocar os objetos lá.
Script da Unity: Mesh Combines
Para aprender mais, visite nosso blog: www.crieseusjogos.com.br
Também temos vídeos toda semana em nosso canal do Youtube: Crie seus jogos – Youtube
Espero que esse post tenha te ajudado! Abraços!
Igor Sprovieri
Seja o primeiro a comentar.