Guilo Posted June 3, 2011 Share Posted June 3, 2011 Bonjour, Je suis en train de créer un jeu qui consiste en une succession de tableaux sur lesquels le joueur doit trouver des objets. Chaque tableau est composé d'un dizaine d'image de faible résolution, de faible poids (qq ko) et d'une image de fond. Une fois le tableau terminé on passe au suivant, ce qui lance une nouvelle Activity. Je crée donc un Intent, il est démarré puis j'appelle finish() pour terminer l'Activity courante. Le problème est qu'arrivé au 10e tableau, mon programme occupe plus de 30 Mo en mémoire., Je remarque que la mémoire augmente à l'ouverture de chaque nouvelle Activity. Comment y remedier ? Merci. Link to comment Share on other sites More sharing options...
pat Posted June 3, 2011 Share Posted June 3, 2011 il faut recycler tes Bitmaps Link to comment Share on other sites More sharing options...
Guilo Posted June 3, 2011 Author Share Posted June 3, 2011 Bonjour, je vais chercher ça. Mais je n'utilise pas d'objet bitmap directement. Mon image de fond est le background du layout, mes autres images sont des ImageView obtenues par findViewByID et j'en manipule en suite les parametres de leurs layouts. Merci EDIT : En fait pour être plus clair, ce n'est pas vraiment la quantité d'image dans chaque tableau qui pose problème mais bien la non récupération de toute la mémoire après la fin d'une activité. Pourtant finish() est appelé juste après le start() de l'intent. Cela n'est-il pas sensé exécuter le garbage collector ? Link to comment Share on other sites More sharing options...
Guilo Posted June 3, 2011 Author Share Posted June 3, 2011 J'ai essayé avec leur méthode (http://liber.us/tarotbot/fr/android/dreaming-of-electric-sheep-memory-management-in-android). J'ai effectivement une consommation de mémoire bien inférieure mais sur certaines images j'ai : "06-03 20:34:09.710: ERROR/AndroidRuntime(14450): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4050ae30" Alors qu'il ne s'agit plus de la même activité. Donc rien n'a encore été recyclé dans cette activité. Link to comment Share on other sites More sharing options...
pat Posted June 3, 2011 Share Posted June 3, 2011 tu dois avoir des références qui demeurent et tes objets ce qui empeche le GC de faire son taf. Le mieux ca serait quand meme de recycler tes vues d'une manière ou d'une autre. Link to comment Share on other sites More sharing options...
Guilo Posted June 4, 2011 Author Share Posted June 4, 2011 Quand on recycle un Bitmap, d'après la doc, elle devient inutilisable. Cela parait logique. Mais est-ce que cela signifie que cette image que l'on vient de recycler ne peut plus être utilisée, même réinstanciée, dans une autre activité, à partir d'un layout différent ? Merci Link to comment Share on other sites More sharing options...
raptor079 Posted June 6, 2011 Share Posted June 6, 2011 Bonjour, je suis interressé par ton problème car je viens recement d'y être confronté. Lorsque je lance mon application, j'ai fait une jolie petite animation et je me suis retrouvé bloqué par une "Out Of Memory exception " au lancement de mon activité principale. Pourtant, je change bien d'activité mais la mémoire elle reste consomée. la seule solution que j'ai trouvé c'est de réduire la taille de mes images. j'ai essayé plusieurs choses sans succès: * Recycler au maximum les images ( mon animation était faite avec des background directement intégréer dans mon dossier drawable de l'application, donc pour recycler tout ça j'ai modifier mon code pour récupérer des images depuis la cartes sd et les mettre en background par la suite) * forcer le Garbage Collector * lancer une activité vide entre mes deux activité ( pourquoi pas, en supposant que le temps entre les activité suffirait a libérer la mémoire) J'ai l'impression que la solution de déréférencement a des chances de fonctionner, mais je ne comprend pas comment l'intégrer a mon code. Pour finir, comme tu le dis, il se pourrais que cette mauvaise gestion soit un bug d'android. et donc la... gros soucis. Fait moi signe si tu arrives à quelque chose. Link to comment Share on other sites More sharing options...
Baton Posted June 16, 2011 Share Posted June 16, 2011 Je suis aussi confronté a ce problème. J'ai lu sur le net qu'il faillais recyclé ses bitmap et les mettre a null pour forcé le gc (bizarrement la méthode recycle() ne fait pas grand chose...). this._image.recycle(); this._image = null; C'est effectivement un bug d'android... Link to comment Share on other sites More sharing options...
raptor079 Posted June 17, 2011 Share Posted June 17, 2011 ...(bizarrement la méthode recycle() ne fait pas grand chose...). Je ne suis pas entièrement d'accord. Dans mon cas, la méthode Recycle m'a aidé à corriger les premiers bug ( lorsque je commençais à avoir des dépassements mémoire) J'ai lu quelque part que le recycle() effectue un GC. Par contre, cela ne règle effectivement pas totalement le problème. Si quelqu'un à plus d'informations concernant ce problème .... (pour information, j'ai repousser le problème en réduisant la taille mémoire de mes images en .png grace à photoshop: en passant en couleur indexé, on ne perd pas grand chose en qualité d'affichage mais par contre on gagne 70% d'espace mémoire ! :emo_im_money_mouth: ) @ pluche @ Pat: une idée pour dé-référencer tes images ? Link to comment Share on other sites More sharing options...
pat Posted June 17, 2011 Share Posted June 17, 2011 a part étudier le code ligne par ligne pas vraiment. Parfois on réalise pas à quel point on trimballe des objets référencé d'une classe vers une autre. sinon ya toujours l'utilisation du Traceview si tu as le temps: http://android-developers.blogspot.com/2010/10/traceview-war-story.html C'est du lourd et ca peut aider à comprendre ce qui se passe J'ai eu moi aussi des pbs de memory leak avec mon app. J'ai fini par les résoudre en essayant de recoller le plus possible aux design pattern existants comme les viewHolders pour les listview etc.. puis en évitant de passer les activity dans les constructeurs des methodes a droite à gauche, se concentrer sur l'essentiel, revoir son archi, passer juste le context, etc.. Bon courage! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.