Existe-t-il un moyen plus performant d’animer une séquence d’images?
-
10-07-2019 - |
Question
Je crains que ce soit un code diabolique:
CGRect iRect = CGRectMake(0.0f, 0.0f, 320.0f, 400.0f);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:iRect];
imgView.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"b0001.png"],
[UIImage imageNamed:@"b0002.png"],
// 150 more
[UIImage imageNamed:@"b0152.png"],
nil];
Je me souviens un peu de cette imageNamed: is evil. Si je le fais de cette façon et si je dois fournir des objets UIImage, ces objets UIImage chargent immédiatement ces fichiers d’image en mémoire, non? Et, à part cela, tous ces 152 objets volumineux UIImage prennent une pause importante dans la mémoire car ils sont autoreleased, n'est-ce pas?
En conclusion, utiliser cette technique est nul. Le fait-il? Je ne sais pas. Sur mon iPod touch de première génération, cet appareil semble fonctionner sans décalage à 25 ips. Très lisse et agréable. La seule chose qui me fait peur, c’est que certains autres appareils puissent penser différemment à ce sujet. Bien que je dispose du plus faible ipod touch programmable disponible.
Quoi qu'il en soit, est-ce que quelqu'un y voit une possibilité d'amélioration? Ou ne devrais-je pas utiliser cela et utiliser setImage: of UIImageView dans un algorithme propre qui chargerait et positionnerait ces images avec des sélecteurs retardés en utilisant cette chose chunky imageWithContentsOfFile (peut être nommé différent), sans relâche automatique? Peut-être qu'un type malin a-t-il écrit une petite librairie pour des vidéos haute performance composées de séquences d'images?
(non, la vidéo n'est pas une option sur l'iPhone; les frameworks Apple pour cela ne supportent que le plein écran, et je ne connais rien d'autre qui puisse le faire.)
La solution
Je voudrais éviter d'essayer de charger autant d'images dans un tableau UIImageView. Une question similaire a été posée ici . La méthode de mise en mémoire tampon que je décris devrait également s’appliquer à votre situation.
Autres conseils
Vous avez raison à propos de imageNamed ... vous ne devez pas l’utiliser dans de nombreux cas car il met en cache l’image. Utilisez:
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
Vous ne pouvez utiliser imageNamed que lorsque
1) Vous réutilisez une icône à plusieurs reprises (vues de table, etc.)
2) Vous n'avez pas implémenté votre propre système de mise en cache