A chaque fois que l'on veut dessiner un GameObject à l'écran , le moteur de Unity, envoie un draw call, comprenez appel pour dessiner, aux API graphiques telles que OpenGL ou direct3D.
Apprenez à optimiser votre jeu vidéo en utilisant le static batching.
Mais les "draw calls" sont gourmands en ressources, et comme le travail de fond à effectuer à chaque appel est conséquent, cela impact de fait le CPU.
Afin d'éviter de voir le FPS tomber et ainsi d'avoir un jeu injouable, nous devons apprendre à contrôler et surtout optimiser nos appels graphiques ou "draw calls".
Comment dessiner à l'écran avec Unity?
D'après la documentation, le moteur de jeu Unity utilise deux approches built-in pour gérer les "draw calls":
- Le Dynamic batching: pour des Meshes assez petits, cela transforme leurs sommets sur la CPU, regroupe plusieurs sommets similaires et les dessine tous en une fois.
- Le Static batching: combine les GameOjects statiques ("static" ie. qui ne bougent pas) en grands Meshes, et les dessine plus rapidement.
Ces techniques built-in ont de gros avantages. Par exemple elles permettent d'optimiser en réduisant ainsi les draw calls, tout en laissant la possibilité d'utiliser le culling individuellement pour autant.
Cependant elles ne sont pas parfaites. En effet le static batching consomme plus de mémoire/stockage et le dynamic batching provoque des pics au niveau du CPU.
Préparer un Material au batching
Seuls des GameObjects qui partagent le même Material peuvent être "batchés" ensemble.
Super mais la plupart du temps les Textures changent d'un même modèle 3D à l'autre, impossible de regrouper ces GameObjects pourtant casi identiques..
Il suffit alors de réunir toutes les textures dans une seule grande image, et ainsi vos modèles partageront bien le même grand Material... Pour plus de détails renseignez vous sur les Texture atlases.
Pour aller plus loin
Utiliser le Dynamic batching
Unity gère automatiquement ce type de batching, vous n'aurez donc rien faire, si ce n'est de vérifier que vos Material respectent les conditions d'éligibilité.
- En premier lieu on retrouve bien entendu le fait que vos Material sont bel et bien partagés par plusieurs GameObjects.
- Mais il faut aussi savoir qu'il faut maintenir le nombre de vertex de dessous de 900, sinon le batching ne sera pas appliqué.
- Retrouvez d'autres conditions spécifiques aux shaders.
Utilisez le Static batching
Le Static batching permet au moteur Unity de réduire les draw calls pour vos éléments à partir du moment où ces derniers partagent encore une fois le même Material ET qu'ils ne se déplacent pas (ie: statiques - static) .
Ce type de batching est souvent plus efficace que le Dynamic batching, mais il utilise plus de mémoire.
Afin de pouvoir utiliser le static batching, il suffit de cocher la case "Static" sur vos GameObject immobiles dans votre jeu vidéos (murs, routes, certaines props...)
Au final nous aurons fait un premier overview de la notion de batching sous Unity, ainsi que différents types de batching, permettant à terme d'optimiser votre jeu vidéo.