PDA

Voir la version complète : Calculs inutiles en rendu animé ?



César Vonc
13/01/2014, 23h20
Salut,

J'ai remarqué un comportement très étrange lors d'un rendu animé avec l'Illumination globale qui fait perdre beaucoup de temps.

À chaque image, C4D semble calculer toutes les expressions de toutes les images à chaque fois ! :icon_eek:


Créez un objet, ajouter un script Python dessus avec, par exemple :



import c4d

def main :
print doc.GetTime().GetFrame(30)


Activez l'IG et lancez un rendu animé.

Avec les paramètres par défaut (90 images), la console affichera les images 1 à 90 à chaque rendu..., soit 90 * 90 = 8100 calculs au lieu de 90... !


Ça me semble être une perte énorme, j'ai du mal à comprendre la logique, si C4D a vraiment besoin de connaitre autant de paramètres à l'avance pour l'IG, et encore, pourquoi continuer de calculer les images précédentes à l'image en cours...

Si quelqu'un a une explication, ça m'intéresse vraiment !

Floc
14/01/2014, 02h31
Juste par curiosité j'ai essayé, mais chez moi en version 13 il ne se passe rien de spécial. la console affiche le numéro de frame à chaque frame calculée. A la fin le nombre de ligne correspond bien au nombre de frames calculées. Donc une évaluation par frame .
L'IG est bien activée et le script est sur un python TAG assigné à un objet (au cas ou j'aurai rien compris).
J'ai aussi essayé en mode IG animation mais rien de bizarre, si ce n'est que la console affiche 2 fois la série de frames mais ça c'est plutot normal.
Désolé ça ne fait pas vraiment avancer ton schmilblick, a part de savoir que ce n'est pas sytématique.

César Vonc
15/01/2014, 00h59
Cela semble moins prononcé sur la R13, et encore, je crois que cela dépend du mode de rendu en IG.

Je crois avoir compris ce qu'il se passe, C4D ne recalcule en réalité pas tout le document à chaque fois dans ces docs récurrents, mais récupère le cache de chaque objet s'il en existe un.
Or les expressions ne sont pas mises en cache car d'après la doc, elles sont censées agir comme une fonction mathématique :
http://www.maxonexchange.de/sdk/CINEMA4DPYTHONSDK/help/misc/writingdelta.html?highlight=tagdata


Cependant, en ce qui concerne les objets de type TagData, il est possible de détecter si C4D recherche son cache ou non, via le marqueur de la fonction TagData.Execute(self, tag, doc, op, bt, priority, flags).

Lors du rendu « réel », j'ai remarqué que ce marqueur prend simultanément les valeurs :
EXECUTIONFLAGS_ANIMATION
EXECUTIONFLAGS_EXPRESSION
EXECUTIONFLAGS_CACHEBUILDING
EXECUTIONFLAGS_RENDER

Alors que pour les docs où il cherche juste à récupérer son cache (ici, 90 fois par image), ce marqueur ne prend plus que :
EXECUTIONFLAGS_ANIMATION
EXECUTIONFLAGS_EXPRESSION



J'ai donc ajouté :


if not (flags & c4d.EXECUTIONFLAGS_CACHEBUILDING): return c4d.EXECUTIONRESULT_OK

En début de ma fonction Execute() pour qu'elle ne se calcule pas avec ces documents là. Et vu que si elle ne calcule pas, dans le cas de mon module Influence Point, ma propriété influence existe toujours mais n'est juste pas mise à jour, c'est bien son cache qui est récupéré et le rendu reste inchangé.

J'ignore cependant si c'est une bonne méthode pour d'autres genre d'expressions. En tout cas, ça m'économise bien quelques secondes en temps de préparation de rendu !