2010-12-12 11 views
2

Supposons que vous ayez plusieurs animations à réaliser avec une séquence de PNG dans un UIImageView. Si nous avons beaucoup d'images dans l'animation, nous avons un délai à partir du moment où nous envoyons le message [myImgView startAnimation] car le chargement de toutes les images en mémoire. J'ai remarqué que le chargement est paresseux: tant que le message startAnimation n'est pas envoyé, les images ne sont pas chargées en mémoire. Pour éviter le problème de délai, je charge toute l'animation dans le délégué de l'application, attacher comme sous-vue et animer une fois. Je veux comprendre quelle est la meilleure solution? Et si ma solution actuelle a un draback?Préchargement d'actifs sur iOS

Répondre

1

Vous avez raison concernant le chargement paresseux. Je n'ai jamais été capable de déterminer si elle est réellement paresseuse à partir du disque ou de la décompression paresseuse mais dans les deux cas, une UIImage (et, en dessous, une CGImage) n'est pas nécessairement entièrement traitée et prête à dessiner jusqu'à ce qu'elle soit réellement utilisée. Je suppose qu'il peut convenir à nouveau dans le futur, en fonction de la façon dont Apple gère les avertissements de mémoire en interne. Si vous vouliez être très enthousiaste, je suppose que la meilleure solution serait d'utiliser CoreGraphics pour charger et décompresser les images en arrière-plan, en mettant un terme au chargement à startAnimation uniquement si le chargement n'est pas terminé. Vous ne pouvez pas obtenir cela directement avec les objets UIKit car ils ne sont pas appelables ailleurs mais sur le thread principal. Vous devez obtenir une CGImage, dessiner dans un contexte bitmap, puis créer une image à partir du contexte bitmap et l'envoyer sur le thread principal pour l'encapsuler dans un UIImage. Et il serait probablement intelligent d'utiliser une NSOperationQueue pour marshall la liste complète des opérations. Supposons que le coût de démarrage supplémentaire du blocage ne vous dérange pas lorsque vous chargez tous les fichiers PNG et que vous traitez correctement les avertissements de mémoire, votre approche actuelle ne devrait poser aucun problème. meilleure solution tout en restant dans des choses de haut niveau Objective-C.

+0

Une partie du problème est également que la décompression PNG est (relativement parlant) très lente, en raison de la complexité de l'algorithme lui-même. Les images JPEG sont généralement plus rapides à charger, mais évidemment pas toujours idéales. Tant que les données d'image peuvent être préchargées, l'impact de la décompression à la volée peut être évité. –

+0

Ce qui suggère une solution alternative: encoder les PNGs avec une décompression minimale absolue, ce qui je suppose serait le filtre 0 (aucune prédiction) pour chaque ligne de balayage et chaque bloc de dégonflement stocké comme une section brute/littérale. Bien que je ne sois pas au courant d'un logiciel qui vous permet de modifier la sortie dans cette mesure et je sais que Xcode effectue un traitement supplémentaire sur les fichiers PNG, vous devrez probablement faire de votre mieux pour dupliquer correctement vos fichiers PNG non compressés. paquet. – Tommy