PROJET AUTOBLOG


blog.fevrierdorian.com

source: blog.fevrierdorian.com

⇐ retour index

Pourquoi les instances Maya sont si lourdes?

samedi 25 mars 2017 à 23:52

Comme vous le savez sûrement, Maya propose un moyen de faire des instances.

Comme vous vous en doutez peut-être, ce n’est pas si simple.

Et ce que vous ne savez peut-être pas c’est qu’en pratique (plus de 1000 instances) ça ne fonctionne pas des masses

Essayons de comprendre pourquoi. :redface:

Grossièrement une instance c’est ça:

Ainsi, on ne stock la géométrie qu’une seule fois en mémoire, tout le reste étant des position+rotation+scale (un transform) qui y font référence.

C’est très pratique dans le cas, par exemple, d’une forêt ou l’arbre est la géométrie et les milliers de points, des instances.

La monté en charge

Jusqu’ici c’est plutôt pas mal. Sauf que vous allez voir que la collision de deux choix d'architecture ont littéralement claqué la porte a toute possibilité de monté en charge du système.

Le premier est dû a la manière dont Maya fonctionne: Tout est connexion.

Le second est dû à un problème d’expérience utilisateur: Comme il est tout à fait légitime pour un utilisateur de vouloir assigner un material différent à chaque instance, quand Maya créé une instance, cette dernière dispose de son propre slot de material. Ce qui nous donne ceci (voir le bonhomme énervé):

Comme vous pouvez le constater, la shape (en mauve car c'est une instance) possède autant de connexion au shading group qu'il y a d'instance:

shape.instObjGroup[0].initialShadingGroup.dagSetMembers[0]
shape.instObjGroup[1].initialShadingGroup.dagSetMembers[1]
…
shape.instObjGroup[999].initialShadingGroup.dagSetMembers[999]

L'objectif étant, encore une fois, pour Maya, de garder la possibilité d'assigner un material différent à chaque instance.

Ce choix, bien que légitime, porte un gros préjudice aux performances. Vers 1000 instances, il faut plus d’une seconde, quand vous sélectionnez un objet, pour afficher l’Attribut Editor. La plupart des interfaces se mettent à ramer, le delete all by history pédale, le temps de sauvegarde est énorme et je ne parle même pas de certaines opérations en script qui deviennent très lente (parent par exemple).

Il aurait été intéressant de pouvoir forcer un material unique par shape d’instance. Évitant ainsi des milliers de connexions qui, bien souvent, pointent vers le même material.

Des solutions?

Disons que ça dépend de ce que vous faites dans Maya. Si vous voulez faire du rendu, je suppose que ça dépend du moteur mais naïvement je dirais que c’est mort et que vous allez souvent devoir bricoler pour utiliser le système d’instance du-dis moteur. Ce dernier se chargeant d’interpréter le bricolage qu’il vous impose (ah le bon vieux locator avec une connexion message vers un groupe :hehe: ).

Si vous ne faites que de la manipulation de transform (des forets!), une solution consiste à briser toutes les connections de material de votre shape:

Vous vous retrouverez donc sans material (mesh transparent/vert):

Vous pouvez toujours passer en use default material:

Notez que lors de mes tests (Maya 2016), ceci ne marchait pas en Viewport 2.0. Il fallait repasser en Legacy Default Viewport. :aupoil:

Conclusion

Les instances dans Maya restent assez complexe à mettre en place. Le vrai problème vient du fait qu’on ne peut pas travailler avec des milliers d’objets (ce qui est quand même un comble).

:marioCours: