Question

Je travaille sur l'amélioration des performances de mon jeu IOS COCOS2D. Je vérifiais les allocations de mémoire de l'application à l'aide de l'outil Instruments lorsque j'ai remarqué une chose. Il y a trop d'objets CFString déclarés et détenus par l'appel [nsbundle mainbundle]. Ça dit,

Catégorie: CFString (immuable) Appelant responsable: [nsbundle mainbundle

Il y a beaucoup d'endroits dans mon code où j'ai écrit des lignes suivantes

[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];

Ce problème CFString est-il dû au code ci-dessus parce que je donne une chaîne codée dure dans la méthode PathForresource? Ou quelle peut être la raison de ce problème? quelqu'un peut-il aider s'il vous plait? Cette allocation CFString prend environ 2 Mo de mon code, donc je m'inquiète.

Cordialement

Était-ce utile?

La solution

Ces CFString sont dus à avoir un grand nombre de ressources dans votre bundle d'applications. Dans mes tests, j'ai trouvé 1 CFString alloué pour chaque fichier à la racine du bundle. Vraisemblablement, c'est une sorte de mise en cache des noms de chemin.

Je travaille actuellement sur une application avec des 1 000 ressources dans le bundle et ces cordes immuables prennent ~ 300k. Lorsque j'enlève la majorité d'entre eux, je me retrouve avec environ 20k, avec environ 100 cfStrings pour environ 80 ressources dans le paquet.

Il semble que la réponse à la réduction de celles-ci consiste à mettre des ressources dans des sous-répertoires dans le faisceau. Vous pouvez utiliser une "référence de dossier" dans Xcode pour ce faire.

Par exemple, vous pourriez avoir 1 000 PNG pour votre jeu. Mettez-les dans un dossier appelé "Assets" dans votre projet (sur disque). Faites glisser le répertoire "Assets" vers Xcode et au lieu de créer un groupe, créez une référence de dossier.

Autres conseils

Non, ce n'est pas pourquoi NSBundle alloue les chaînes, et non, vous ne faites rien de mal là-bas. Il semble extrêmement peu probable que - [nsbundle mainbundle] alloue en fait 2 Mo de chaînes, donc je vous suggère de regarder certaines des autres traces de pile d'allocation et de voir si vous pouvez trouver le véritable coupable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top