L'optimisation est un point clé de tout jeu vidéo, et tout concepteur y sera un jour où un autre confronté. Apprenez à utiliser le GPU Instancing avec Unity.
Le GPU Instancing peut considérablement réduire le nombre de draw calls utilisés par scène. De ce fait les performances de votre projet n'en seront que meilleures.
Découvrez le GPU Instancing
On utilise cette technique pour "dessiner" (render dans le jargon technique) plusieurs copies du même Mesh (modèle 3D) comme un seul, réduisant ainsi le nombre de draw calls.
C'est très utile pour "dessiner" à l'écran des objects présents en grand nombre dans votre scène, comme des arbres ou encore des bâtiments.
En effet sans cette technique ce sera le CPU qui sera chargé de "dessiner" tous ces objets, utilisant ainsi de précieuses ressources CPU. Ce sera autant de ressources en moins pour les calculs du moteur physique ou encore les autres exécutions de scripts diverses...
Ainsi en activant le GPU Instancing, on va soulager un peu notre CPU, car dorénavant ce sera le GPU qui sera chargé de "dessiner" les élément 3D.
Activer le GPU Instancing
Par défaut les Materials du core de l'éditeur Unity, n'ont pas le GPU Instancing activé.
Ainsi pour l'activer, il suffit de choisir votre Material, puis dans la fenêtre de l'Inspector, de cocher Enable Instancing.
Etude comparative
Dans un premier temps on crée un script de test super simple, histoire d'instancier quelques milliers de prefabs en un coup:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GPUITest : MonoBehaviour {
public Transform startPoint;
public GameObject prefab;
public int nbreToInstantiate = 100;
public int nbrePerRow = 10;
public int decalX = 5;
public int decalZ = 5;
// Use this for initialization
void Start () {
int rowNumber = 0;
int actualRow = 0;
for (int i = 0; i < nbreToInstantiate; i++){
Vector3 newPos = new Vector3(startPoint.position.x +(decalX * rowNumber ),startPoint.position.y,startPoint.position.z+(decalZ * actualRow));
GameObject item = Instantiate(prefab, newPos, prefab.transform.rotation) as GameObject;
rowNumber++;
if (rowNumber >= nbrePerRow){
rowNumber = 0;
actualRow++;
}
}
}
}
Puis on assigne bien sûr ce script à un GameObject empty dans notre scène. Enfin on le paramètre en indiquent le point de démarrage, le nombre de prefabs à instancier ...
Le Material utilisé pour dessiner notre prefab, utilise le shader de base de Unity, il n'a donc pas par défaut le Enable Instancing coché !!
Le résultat de ce premier test, est celui de la capture ci-dessus, avec 10 000 prefabs instanciés ET visible de la caméra. On peut voir que le FPS calculé est de 18, ce qui est bas...très bas..d'autant que le test ici est fait sur un PC performant !!
Faisons cette fois-ci, un second test, dans les mêmes conditions, mais avec la coche activée pour notre Material.
Comme vous pouvez le voir, juste en activant le GPU Instancing, on a un bien meilleur FPS calculé : 42 FPS au lieu de 18 FPS !!
De plus vous pouvez remarquer que le nombre de batches a considérablement diminué ...on a bien réussi à soulager notre CPU...excellent !!
Il donc clair que cette optimisation est sans conteste très efficace !!