Description du problème

Depuis un petit moment, les développeurs de Maya tentent d’isoler l’interface graphique afin que cette dernière ne gèle jamais. Ainsi, le chargement des textures et la préparation des matériaux du viewport se font en arrière-plan. Maya est ensuite informé de la disponibilité de ces ressources. Il y a alors un blocage de quelques millisecondes et les textures et matériaux apparaissent.

Ce procédé augmente la durée totale du chargement (x 1,1 d’après la documentation), mais le fait que ce chargement soit fait en arrière-plan, sans bloquer l’utilisateur, en diminue fortement la perception.

Le mode « Parallel » utilise un thread séparé, dédié à la construction des matériaux et aux demandes de chargement des textures, vous permettant de continuer à travailler sur la scène pendant que les matériaux se construisent et que les textures se chargent. Le temps de chargement total est généralement 1,1 fois supérieur à celui du mode « Immediate ».

(traduction de la documentation)

Le problème, pour nos playblast, vient du fait que Maya n’attend pas que tout soit chargé avant de le démarrer, ce dernier calculant une, voir plusieurs, images possiblement incomplètes. Bien entendu, le problème n’apparaît pas lors d’une utilisation manuelle de Maya, car les matériaux et textures ont le temps de se charger. :zinzin:

C’est peut-être un bug. J’ai, en effet, tendance à croire que le but de la commande playblast est de faire un… playblast et donc, que Maya devrait attendre que toutes les ressources nécessaires à l’image soit chargées avant de démarrer. Dans tous les cas, ce n’est pas ce qu’il fait, nous laissant avec des animateurs, réalisateur et superviseurs mécontents (pléonasme ? :trollface: ).

Vous vous en doutez, il faut qu’on passe le chargement des matériaux et des textures en « Immediate », ce qui aura pour effet de bloquer Maya jusqu’à ce que tout ce qui est nécessaire à l’image soit chargé. :redface:

Il y a deux façons de faire ça. :sourit:

Via les préférences

Vous pouvez résoudre le problème localement en passant par les préférences de l’utilisateur : Display > Heads Up Display > Material Loading Details. (voir la page de documentation précédente).

Comme vous vous en doutez, cette solution est loin d’être optimale : Si vous gérez une ferme de calcul, il peut être contraignant d’avoir à modifier les préférences sur chaque machine.

Via la commande displayPref

Cette commande permet de manipuler les paramètres globaux d’affichage. Depuis Maya 2016 (J’ai vérifié…), les développeurs ont ajouté un argument dédié : materialLoadingMode.

Cet argument, peut prendre trois valeurs (fichtre, je suis sûr qu’il vous tarde de savoir lesquels) :

  • immediate
  • deferred
  • parallel

Comme vous vous en doutez, l’argument immediate résoudra votre problème :

import maya.cmds as cmds
cmds.displayPref(materialLoadingMode='immediate')

Note concernant l’argument court

La documentation indique que la version courte de cet argument est -mld. Essayons :

cmds.displayPref(mld='immediate')
# Error: Invalid flag 'mld'
# Traceback (most recent call last):
#   File "<maya console>", line 2, in <module>
# TypeError: Invalid flag 'mld' # 

Mince…

Dans le doute, faites un help sur la commande :

cmds.help('displayPref')
# Result: 

Synopsis: displayPref [flags]
Flags:
   -q -query
 -aop -activeObjectPivots            on|off
  -da -displayAffected               on|off
 -dfs -defaultFontSize               Int
 -dgr -displayGradient               on|off
  -fm -fontSettingMode               Int
  -gf -ghostFrames                   Int Int Int
  -lw -lineWidth                     Float
 -mhr -maxHardwareTextureResolution 
 -mlm -materialLoadingMode           String  << Ici!
 -mtr -maxTextureResolution          Int
 -pet -purgeExistingTextures        
 -roe -regionOfEffect                on|off
 -sfs -smallFontSize                 Int
  -st -shadeTemplates                on|off
 -tdp -textureDrawPixel              on|off
 -wsa -wireframeOnShadedActive       String

Comme vous pouvez le voir, ce n’est pas -mld, mais -mlm qu’il faut utiliser. La documentation est fausse…

cmds.displayPref(mlm='immediate')

Et voilà !

Conclusion

Qu’est-ce que vous faites encore là ? Vos animateurs souffrent, leurs playblasts ont besoin de vous !

Merci à Paul-Émile pour le tuyau. :dentcasse:

:marioCours: