16 votes

Meilleure façon de charger des images à partir d'un paquet d'applications

Quelle est la meilleure façon de charger des images à partir du paquet principal de l'application. J'utilise

[UIImage imageNamed: "image.png"];

Mais j'ai entendu dire que ce n'était pas bon en termes d'utilisation de la mémoire et de performances. Quelqu'un peut-il me donner son avis à ce sujet ? Mon application lit un grand nombre d'images à partir du paquet principal au moment du lancement. Je souhaite rendre ce processus aussi efficace que possible.

Meilleures salutations

13voto

justin Points 72871

S'il n'existait qu'une seule et unique "meilleure méthode", les moyens de charger des images de différentes manières n'existeraient pas (sauf pour des raisons historiques). Par conséquent, un peu de compréhension vous sera plus utile que la distillation d'une réponse en une "meilleure façon".

+[UIImage imageNamed:] met en cache l'image pour qu'elle puisse être réutilisée, et il s'agit d'une valeur par défaut raisonnable dans la plupart des cas. La mise en cache est excellent s'il est utilisé correctement. Le cache est utile car il permet de minimiser les lectures sur le disque et l'utilisation de la mémoire en partageant et en réutilisant les images chargées, plutôt que de lire et d'allouer une copie pour chaque image que vous devez afficher. Prenons l'exemple d'une image d'icône que vous utilisez sur plusieurs écrans. Souhaiteriez-vous que les données de cette image soient lues et réallouées à chaque fois ? Cela peut entraîner des lectures et des allocations redondantes de données d'image identiques. Si ce n'est pas le cas, utilisez les méthodes de mise en cache.

Si vous ne chargez l'image qu'une seule fois et paresseusement, vous pouvez envisager des approches sans mise en cache.

  • Les données d'image peuvent consommer beaucoup de mémoire.
  • La lecture d'une image peut prendre beaucoup de temps - non seulement l'entrée/sortie du disque, mais aussi la conversion de l'image en une représentation UIImage utilisable (par exemple, la décompression de l'image).
  • Il arrive aussi que l'on doive redimensionner ou mettre à l'échelle une image. dans ce cas, il faut une copie à l'échelle.

En résumé, il y a de nombreuses considérations à prendre en compte, mais si vous avez des ressources correctement dimensionnées que vous réutilisez, la mise en cache est généralement le bon choix.

Si vos ressources ne sont pas correctement dimensionnées, le problème est plus fondamental : vous devez redimensionner les ressources regroupées pour qu'elles soient adaptées à l'objectif visé si vous rencontrez des problèmes de performance. Des images correctement dimensionnées simplifient considérablement le dessin tout en conservant la meilleure qualité d'image.

10voto

Zach Winkler Points 234
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];

8voto

UIAdam Points 3945

Si vous voulez essayer de charger les images sans mise en cache, vous pouvez utiliser :

[[UIImage alloc] initWithContentsOfFile:@"image.png"]; 

Cela pourrait accélérer légèrement le chargement de l'image pour la première fois, puisqu'il n'est pas nécessaire de la mettre en cache au préalable. Si vous n'avez besoin d'utiliser ces images qu'une seule fois, il est probablement judicieux de procéder de cette manière. L'autre avantage de cette méthode est qu'elle permet d'éviter que le cache des images n'occupe la mémoire plus longtemps que nécessaire.

0voto

Mudit Bajpai Points 2099

Pour trouver un seul fichier de ressources à l'aide de NSBundle

NSBundle* myBundle = [NSBundle mainBundle];

NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"];

et pour trouver des ressources multiples :

NSBundle* myBundle = [NSBundle mainBundle];

NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg"
                              inDirectory:nil];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X