Je suis en train de travailler sur un 2D jeu iPhone en utilisant OpenGL ES et je continue à frapper le 24 MO de mémoire limite de mon application crash avec le code d'erreur 101. J'ai essayé très fort pour trouver l'emplacement de la mémoire, mais les chiffres dans les Instruments sont toujours beaucoup plus grand que ce à quoi je m'attends.
J'ai couru à la demande avec la Mémoire du Moniteur, de l'Objet Alloc, les Fuites et OpenGL ES instruments. Lorsque l'application est chargée, de mémoire physique libre gouttes de 37 MO à 23 MO, l'Objet Alloc s'installe autour de 7 MO, les Fuites de montrer deux ou trois fuites de quelques octets la taille, le Gart Objet d'une Taille d'environ 5 MO et la Mémoire du Moniteur dit que l'application prend environ 14 MO de mémoire réelle. Je suis perplexe car d'où vient le mémoire aller – quand je creuse dans les Allocations d'Objets, la plupart de la mémoire est dans les textures, exactement comme je m'attends. Mais à la fois mon propre texture, l'allocation de compteur et le Gart Taille de l'Objet acceptez que les textures devraient prendre quelque part autour de 5 MO.
Je ne suis pas au courant de l'attribution de toute autre chose qui serait utile de mentionner, et l'Objet Alloc est d'accord. Lorsque la mémoire est-elle aller? (Je serais heureux de vous fournir plus de détails si ce n'est pas assez.)
Mise à jour: j'ai vraiment essayé de trouver où je pourrais allouer une grande quantité de mémoire, mais sans résultats. Ce qui me motive le sauvage est la différence entre les Allocations d'Objets (~7 MO) et le réel de l'utilisation de la mémoire, comme illustré par la Mémoire du Moniteur (~14 MO). Même si il y avait d'énormes fuites ou d'énormes morceaux de mémoire, je l'oublie, l' devraient toujours apparaître dans les Allocations d'Objets, ne devraient-ils pas?
J'ai déjà essayé les habituels suspects, c'est à dire. l' UIImage
avec son cache, mais cela n'a pas aidé. Est-il un moyen de suivre l'utilisation de la mémoire "débogueur" de style, ligne par ligne, regarder chaque énoncé de l'impact sur l'utilisation de la mémoire?
Ce que j'ai trouvé jusqu'à présent:
Vraiment, je suis en utilisant beaucoup de mémoire. Il n'est pas facile de mesurer la réelle consommation de mémoire, mais après beaucoup de comptage, je pense que la consommation de mémoire est vraiment élevé. De ma faute.
Je n'ai pas trouvé de moyen facile de mesurer la quantité de mémoire utilisée. La Mémoire de Surveiller les chiffres sont exacts (ce sont les chiffres qui comptent vraiment), mais la Mémoire du Moniteur ne peux pas vous dire exactement où la mémoire s'en va. L'Objet Alloc outil est presque inutile pour le suivi de la réelle utilisation de la mémoire. Lorsque je créer une texture, la mémoire allouée compteur va pendant un certain temps (la lecture de la texture dans la mémoire), puis descend (en passant les données de la texture OpenGL, libérer). C'est OK, mais ne se produit pas toujours – parfois l'utilisation de la mémoire reste élevé, même après que la texture a été transmis à OpenGL et libéré de "ma" mémoire. Cela signifie que le total de la quantité de mémoire allouée, comme indiqué par l'Objet Alloc outil est plus petit que le total réel de la consommation de mémoire, mais plus grand que la consommation réelle, moins de textures (
real – textures < object alloc < real
). Aller à la figure.J'ai mal lu le Guide de Programmation. La limite de mémoire 24 MO s'applique aux textures et les surfaces, et non pas l'ensemble de l'application. La véritable ligne rouge se trouve un peu plus loin, mais je n'ai pas trouvé de chiffres. Le consensus est que de 25 à 30 MO est le plafond.
Lorsque le système est à court de mémoire, il commence l'envoi de l'avertissement de mémoire. Je n'ai presque rien de gratuit, mais que d'autres applications ne libérer la mémoire vers le système, en particulier Safari (ce qui semble être la mise en cache des sites web). Lorsque la mémoire libre, comme indiqué dans la Mémoire du Moniteur va de zéro, le système commence à les tuer.
J'ai dû mordre la balle et de réécrire certaines parties du code pour être plus efficace sur la mémoire, mais je suis probablement encore en le poussant. J'