Memory leaks dans OS 3.0
allian
Membre
Salut à tous j'ai depuis hier mon certificat officiel,
j'ai donc installé le nouvel SDK et tout le reste pour tester finalement sur mon device (3GS en passant).
Déjà sur le simulateur j'ai d'énormes problèmes de mémoire, c'est à dire que le jeu lag énormément !! à prime abord je me suis dit que cela devait venir du Simulateur mais en faite non, sur le téléphone j'ai exactement le même problème alors qu'en 2.2 tout roulait parfaitement...
D'autres personnes ont elles rencontré ce genre de problèmes ??
Merci
j'ai donc installé le nouvel SDK et tout le reste pour tester finalement sur mon device (3GS en passant).
Déjà sur le simulateur j'ai d'énormes problèmes de mémoire, c'est à dire que le jeu lag énormément !! à prime abord je me suis dit que cela devait venir du Simulateur mais en faite non, sur le téléphone j'ai exactement le même problème alors qu'en 2.2 tout roulait parfaitement...
D'autres personnes ont elles rencontré ce genre de problèmes ??
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Sur l'iPhone en particulier, un memory leak important génère rapidement un crash de l'application par manque de mémoire (car il n'y a pas de système de mémoire virtuelle).
La cause du problème est à rechercher ailleurs. Pour cela l'outil "Instruments" est le plus adapté.
D'apres ce que j'en ai tiré mon app occupe 4-5MB de RAM ce qui est raisonnable je pense, parcontre niveau CPU c'est du 60-90% voir plus par moment !! je comprend pas comment cela est possible vu que je n'utilise pas OpenGLEs ni de 3D ??
je met en PJ le save de Instruments. (mon app s'appelle Bleeker)
Merci
Inutile de faire de la 3D pour solliciter le CPU... Il faut se souvenir que le CPU de l'iPhone est bien moins puissant que celui de ton Mac !
Apparemment ton appli est un jeu, tu n'utilise pas openGL donc j'en déduit que tu travaille avec des UIView ; jusque là tout va bien.
Mais si tu fait des "setNeedDisplay" à foison avec des uperposition de vues non opaques avec PNG transparents, ben faut pas s'étonner que ça rame
Par ailleurs, fait très attention à ne pas te fier au simulateur pour la performance. Quelque chose de très fluide sur le simulateur peut très bien enterrer un iPhone. Fait d'autant plus attention à tout ce qui peut bouffer du CPU, car tu as un iPhone 3GS, qui est donc plus puissant qu'un 2G ou qu'un 3G. Cela signifie que si ça lague un poilush sur ton 3GS, tu peut être sûr que ça va ramer à mort sur les autres iPhone et iPod touch...
Il faudrait que tu nous en dises plus sur ton code.
Du coup je dois faire quoi pour que ca aille mieux ?
Mettre une croix sur mes PNG transparents ? ou autres ?
Encore un fois, sans code il sera difficile d'avancer quoi que ce soit.
De toute façon, d'une manière générale, partout ou tu peux éviter la transparence, évite là et passe tes vues en opaque. On peut très souvent remplacer l'usage de la transparence si le fond est de couleur unis par exemple
Je viens d'essayer de supprimer momentanément les bouches et les bonus, cava un peu mieux mais quand je bouge mon personnage ca lag encore..
Je sais pas quoi te mettre comme code, il y en a pas mal donc je sais pas trop.
EDIT : sous OS 2.2.1 cela fonctionnait très bien
Voici mon drawRect
Le problème principal doit venir d'ailleurs, je vais consulter ton log d'instruments j'en serais peut etre plus
Merci beaucoup de ton aide
A mon avis cela vient plus d'un problème de mémoire.
Lance instruments avec Leaks depuis XCODE (Run > Start With Performance Tool > Leaks) et regarde si tu n'a pas tout plein de pique oranges... pendant que tu joue à ton jeu.
Regarde aussi dans ton code si, par ailleurs, tu n'abuse pas des autorelease ce qui pourrait saturer ton runLoop et provoquer des ralentissements (je suppose)
Les autorelease j'en utilise presque pas. Je fais tout à la main ou presque et d'apres Clang GUI je n'ai pas fait d'oublis.
Je t'aide là , hein ?
De toute façon tu ne devrais pas en avoir du tout (à mon avis ?)
Ce n'est sûrement pas une question de 3.0 contre 2.2.1.
- Revoie la structure de ton code , un Pacman ne demande pas des ressources énormes si on pose correctement le problème.
- Respecte la règle : "c'est au device/simulator de faire ses rafraichissement graphiques selon son rythme"
- Fais tous les calculs avant de lancer un setNeedsDisplay
Une fois cela fait je passe à ma méthode gérant le labyrinthe et donc son rafraichissement le nouveau tableau. Celle ci le parcours et dessine ou pas des boules et les murs.
Je viens de penser au fait que mon setNeedsDisplay est appelé à chaque interval de ma méthode move qui est appelé toutes les 0.12 secondes tant que le joueur touche l'écran du coup c'est surement à cause de cela.
J'ai complétement changé la façon de faire, mon setNeedsDisplay est devenu setNeedsDisplayInRect du coup au lieu de tout redessiner je redessine uniquement un petit carré de 20 sur 20 et comme ça plus aucun soucis.
Au passage j'utilise les différentes méthodes animation de UIImageView au lieu de faire ça à la main et ca a l'air un peu moins gourmand aussi.
Reste uniquement un petit lag occasionnel lorsque je joue un son. Pourtant j'utilise le prepareToPlay et le joue uniquement le moment voulu.