Bonjour,
Dans le cadre d'un projet personnel, une "AI" pour un jeu, j'avais besoin d'embarquer Mono dans une librairie dynamique C++, sous Linux (Ubuntu 14.04).
J'ai utilisé SWIG pour avoir un wrapper C++/C#. Le projet fonctionne très bien mais l'occupation mémoire devient trop importante au bout d'un moment car le ramasse-miette ne semble pas faire son travail.
J'ai testé avec le simple remplissage d'une liste, et effectivement, la mémoire n'est pas libérée au fil des appels.
J'ai cru comprendre que Mono-Embed avait un problème récurrent du côté du ramasse-miette?
Pour le process:
Le jeu démarre et ensuite charge pour chaque AI, la librairie C++
Comme il peut y avoir plusieurs instances de mon AI, j'ai créé un gestionnaire (une classe):
La première instance d'AI initialise créé ce gestionnaire et l'initialise:
- mono_jit_init()
- création d'un object et init (callback,etc). pour l'AI avec mono_gchandle_new() (sinon l'objet est détruit entre les appels)
Puis les autres AI (s'il y en a):
- création d'un object et init (callback,etc). pour l'AI avec mono_gchandle_new()
Durant le jeu:
Chaque AI est appelé au fil des événements:
Appels avec mono_runtime_invoke() pour l'object mono concerné.
La librairie Mono peut communiquer au jeu également via le callback.
A la fermeture du jeu, la dernière AI ferme le gestionnaire:
mono_jit_cleanup() etc
Si je n'utilise pas mono_gchandle_new() pour punaiser ("pinned") mes objets, ils sont rapidement détruits par Mono.
J'ai essayé avec mono_gchandle_new_weakref() mais même problème.
J'ai essayé également en appelant directement et régulièrement le GC depuis le C++ avec mono_gc_collect (mono_gc_max_generation ()) mais rien y fait.
Du coup, est ce que le ramasse miette fonctionne sur les objets punaisés?
Partager