Maxscript - Création d'un matériau maxwell => Memory leak

Pour vous simplifier la vie
Avatar de l’utilisateur
Rodman
SL17
Messages : 1055

Maxscript - Création d'un matériau maxwell => Memory leak

Message 28 oct. 2012, 04:30

Bonjour à tous,

J'avais déjà émis le problème sur le forum d'une fuite de mémoire ( https://fr.wikipedia.org/wiki/Fuite_de_m%C3%A9moire ) avec Maxwell sous 3ds max.

Je n'ai pas trouvé de solution c'est donc vers vous que je me tourne pour expliciter clairement le problème.

La création d'un matériau Maxwell dans 3ds max avec Maxscript dans la forme la plus simple (sans calque, sans bsdf) est :

Code : Tout sélectionner

$.material = Maxwell_Material()
"$"c'est pour appliquer sur les objets de la scène.
"material" c'est un paramètre pour assigner un type de Matériau à l'objet
"Maxwell_Material()" c'est pour créer un matériau Maxwell

Si j'ouvre 3ds max, je crée un objet, par exemple une sphere et je lance le script ci-dessus (maxscript -> new script -> copier la ligne de code -> ctrl+E pour lancer le code) la mémoire va augmenter. A chaque fois que vous ferez un ctrl+E la mémoire augmentera.

Même en rajoutant la ligne avec celle ci-dessus, le problème persiste :

Code : Tout sélectionner

$.material = undefined
$.material = Maxwell_Material()
Qui a pour but de supprimer la matériau de l'objet situé dans le "sceneMaterials" ( http://docs.autodesk.com/3DSMAX/15/ENU/ ... ematerials )

J'ai testé d'autres lignes de code pour voir si les matériaux se stockaient dans une bibliothèque de matériaux (voir le lien ci-dessus pour comprendre), mais apparemment non.

Code : Tout sélectionner

toRemove =#()
for i in currentMaterialLibrary do (append toRemove i.name)
for i in toRemove do (deleteItem currentMaterialLibrary(i))
					
toRemove =#()
for i in sceneMaterials do (append toRemove i.name)
for i in toRemove do (deleteItem sceneMaterials(i))
Le code ci-dessus vide les bibliothèques de matériaux "currentMaterialLibrary" et "sceneMaterials".

Du coup, j'en suis à me demander si cela ne vient pas du plugin fourni par Maxwell.

Si quelqu'un à une idée ou peut faire remonter l'information à un développeur expérimenté.

Avatar de l’utilisateur
Rodman
SL17
Messages : 1055

Re: Maxscript - Création d'un matériau maxwell => Memory lea

Message 29 oct. 2012, 18:06

Personne ? :cry:

Si quelqu'un arrive à trouver d'où vient la fuite de mémoire, je pourrais grandement améliorer mes scripts.

Dites moi au moins si vous avez le même problème avec votre 3ds max.

Avatar de l’utilisateur
Roch
Messages : 7581
Localisation : Marseille - France
Contact :

Re: Maxscript - Création d'un matériau maxwell => Memory lea

Message 31 oct. 2012, 08:27

je vais en parler au dev. du plugin maxwell pour 3ds

Avatar de l’utilisateur
Rodman
SL17
Messages : 1055

Re: Maxscript - Création d'un matériau maxwell => Memory lea

Message 31 oct. 2012, 12:07

Super ! Merci Roch.

Avatar de l’utilisateur
Roch
Messages : 7581
Localisation : Marseille - France
Contact :

Re: Maxscript - Création d'un matériau maxwell => Memory lea

Message 06 nov. 2012, 09:23

OK j'ai eu un retour du dév :

Ok, I think we've found a leak inside the material. It's not related to MAXScript, but it happens under some circumstances whenever a material is destroyed. We will fix this for the next build.

Independently of this, materials are not deleted immediately after they are no longer used. MAXScript has a garbage collector which runs when it sees fit. In simple cases you can call the function "gc" to trigger a collection cycle immediately to release the memory:

Code:
-- Make a material.
m = Maxwell_Material()
-- Lose the reference to it.
m = undefined
-- Invoke the garbage collector.
gc()


This will allocate the material then free it immediately, so the memory usage should not go up (after the bug I mentioned is fixed). However, if the material is assigned to an object, the collection cycle will not take it into account immediately:

Code:
-- Assign a new material to the selected object.
$.material = Maxwell_Material()
-- Remove the material from the object.
$.material = undefined
-- Calling the collector explicitly does nothing in this case.
gc()


This code does not free the memory immediately after running (although it should according to the Max docs and common sense). However, if you do other things in the scene and/or wait a bit, the garbage collector will finally realize that the material is no longer used and free the memory. It's not a leak, the object just lives longer than it should, as is the case in many garbage-collected environments. It's also not specific to Maxwell, the same thing will happen with the standard material too.

Avatar de l’utilisateur
Rodman
SL17
Messages : 1055

Re: Maxscript - Création d'un matériau maxwell => Memory lea

Message 06 nov. 2012, 10:21

Super ! Merci Roch !!!

J'avais déjà testé le garbage collector ( https://fr.wikipedia.org/wiki/Ramasse-m ... matique%29 ), mais c'était sans succès. Le développeur à bien trouvé d'où vient l'erreur ! 8)

Il n'y a plus qu'à attendre la prochaine version. :D

Répondre