Logo Makeyourgame
Accueil Les formations Créer un jeu Les ateliers Les tutoriels Blog
Logo Makeyourgame
Les formations Les financements Les exercices La certification Unity
Logo Makeyourgame
Mes objectifs Les jeux Les ressources Le glossaire
Logo Makeyourgame
Les tutos Les tutos Youtube

Comment utiliser le GPU Instancing avec Unity ? : par alto

Unity

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...

En matière d'optimisation une des règles d'or, c'est de réduire au maximum les draw calls

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.

https://makeyourgame.fun/wp-content/uploads/2018/Alexandre/cpuOptimization/activer-gpu-instancing-1024x799.png

 

Attention! Si vous utilisez un shader custom, il doit prendre en charge cette nouvelle fonctionnalité du GPU Instancing. Sinon vous ne verrez pas de coche dans l'Inspector.

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é !!

https://makeyourgame.fun/wp-content/uploads/2018/Alexandre/Unity/cpuOptimization/gpuinstancing-off-1024x731.png

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 !!

Comment afficher le FPS ? Utilisez le script issu des standard assets !!

Faisons cette fois-ci, un second test, dans les mêmes conditions, mais avec la coche activée pour notre Material.

https://makeyourgame.fun/wp-content/uploads/2018/Alexandre/Unity/cpuOptimization/GPUInstancing-ON-1024x752.png

https://makeyourgame.fun/wp-content/uploads/2018/Alexandre/cpuOptimization/GPUInstancing-ON-1024x752.png

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 !!

Attention! Le GPU Instancing ne fonctionne pas sur des SkinnedMeshRender. De plus en 2D nous ne pouvons pas non plus utiliser cette technique.
Pour aller plus loin: Retrouvez un projet qui cherche à porter le GPU Instancing pour les SkinnedMeshRenderer.

Photo de profil

Alexandre Taurisano

Développeur web, C# et certifié Unity. Formateur Unity et Fondateur du studio Event Orizon sur Carcassonne.