2016-08-31 3 views
0

J'ai créé une application JavaFX (8) 3D qui lit les données d'un fichier et les restitue sur certaines scènes.La mémoire fuit lors de la création d'animations à l'aide de JavaFX-3D

Pour rendre un objet, j'utilise:

graphicsContainer.getChildren().add(some3dObject); 

Quand je commenter cette ligne, pour désactiver le rendu, je n'ai pas de fuite de mémoire du tout.

Mais lorsque cette ligne s'exécute, l'application consomme de plus en plus de mémoire. J'ai 30 images par seconde et chaque seconde la consommation de mémoire augmente dans ~ 50MB.

Ceci est bien sûr, même si entre les cadres que j'utilise:

graphicsContainer.getChildren().clear(); 

Les objets 3D que j'assignent aux graphicsContainer sont locales ne sont pas enregistrées dans un champ statique/global. Ils sont uniquement enregistrés en tant qu'enfants du graphicsContainer, qui est nettoyé sur chaque image.

Il semble que quelque chose dans le moteur JavaFX-3D ne m'efface pas vraiment mon travail bien que je supprime chaque fois les enfants du graphicsContainer.

Une idée de comment faire pour que le moteur 3D de JavaFX libère les objets et les rendus 3D passés?

+0

Quelle est votre preuve réelle qu'il y a une fuite de mémoire? Est-ce qu'il finit par manquer complètement de mémoire? Comment savez-vous que le garbage collector n'a tout simplement pas déterminé qu'il doit récupérer (encore) la mémoire inutilisée? –

+0

L'utilisez-vous sous Linux? JavaFX a quelques problèmes de fuites de mémoire sur Linux avec certaines configurations (Techniquement, la fuite est probablement en Mesa, pas Java, mais JavaFX est le seul endroit où je l'ai rencontré) – Itai

+0

Il est sur Windows – SomethingSomething

Répondre

0

Dans mon scénario, toutes les images contiennent le même ensemble d'objets 3D. La seule chose qui change d'une image à l'autre est les emplacements et les transformations de ces objets. Ma solution de contournement consistait à enregistrer dans un tableau chaque objet 3D que je créais (Sphère, Cylindre, etc.). Ensuite, sur chaque image, je change juste leur emplacement et leurs transformations, au lieu de créer de nouveaux objets 3D à chaque fois. .

La mémoire est maintenant autour de 220 Mo tout le temps.

+1

C'est la façon dont un graphique de scène est censé être utilisé. La recréation constante de tout le contenu graphique n'est pas une bonne idée car l'API du graphe de scène n'est pas une API de rendu de mode immédiat. – mipa