2010-08-11 4 views
2

J'écris une application qui utilise UIImagePickerController pour prendre plusieurs photos avec l'appareil aussi vite que iOS le permet. Mon application doit fonctionner sur iOS 3.13 sur toutes les versions du matériel iPhone (v1 à 4). J'utilise UIImagePickerController avec un cameraOverlayView.Comment puis-je vérifier s'il y a suffisamment de mémoire pour traiter une image capturée par UIImagePickerController lors de la prise de plusieurs photos avec l'appareil photo?

Ma question est, comment puis-je déterminer par programme combien de photos peuvent être traitées à la fois en fonction de la mémoire disponible? Voir ci-dessous pour plus de détails. Toute aide est appréciée!

Lorsque le délégué imagePicker reçoit imagePicker: didFinishPickingMediaWithInfo :, le délégué enregistre l'image en taille réelle dans le fichier PhotosAlbum enregistré avec UIImageWriteToSavedPhotosAlbum(). Une fois que j'ai résolu ce problème, l'application fera plus de choses avec l'image en taille réelle.

En tant que test, je prends des photos aussi vite que possible. Finalement, comme prévu, l'application reçoit un avertissement de la mémoire en raison du grand nombre de photos en mémoire tout en enregistrant dans l'album photo. Si j'ignore les avertissements de la mémoire et continue de prendre des photos, l'application est finalement détruite par iOS b/c.

Je n'ai aucun problème à fixer une limite au nombre de photos simultanées que j'autorise l'application à traiter à la fois. Chaque version iPhone HW a différentes capacités de mémoire et différentes résolutions de caméra. Avec iOS 4, le multitâche peut également affecter la mémoire disponible. Je préfère faire cela par programmation que de coder en dur une limite basée sur la version matérielle.

Une application de test qui montre ce comportement est à Source Code

+1

J'ai résolu cela en utilisant les sous-classes NSOperationQueue et NSOperation pour gérer le traitement de l'image (l'op fait plus que simplement enregistrer dans l'album photo). La file d'attente est gérée en limitant le nombre d'opérations simultanées (basées sur iPhone HW), en interrompant la file d'attente sur les avertissements de la mémoire et en reprenant la file d'attente en l'absence d'opérations (sous-classe NSOperationQueue). Sur un iPhone v1, je peux prendre plus de 25 photos rapidement et l'application fonctionne très bien. Bien sûr, il faut beaucoup de temps pour terminer le traitement. – XJones

Répondre

3

Il est plus facile de coder en dur la limite. Il n'y a pas de moyen facile de savoir ce qu'est la «mémoire disponible», car plus de mémoire peut soudainement devenir libre s'il y a un avertissement de mémoire, ou si le téléphone décide de tuer diverses applications de fond (à savoir Safari). Il y a NSRealMemoryAvailable(), mais cela pourrait juste retourner la RAM installée (et c'est probablement ce que [NSProcessInfo physicalMemory] utilise).

Vous pourriez essayer d'enregistrer des images dans une file d'attente - sauvegarder une image à la fois risque d'utiliser moins de mémoire. Vous pouvez également ajouter des marqueurs à votre file d'attente lorsque vous recevez un avertissement de mémoire, et désactiver l'économie d'image lorsqu'il y en a plusieurs (idéalement, vous voulez arrêter de prendre des photos si vous recevez des avertissements de niveau 2 ou 3). ceux-ci sont imprimés sur la console, je ne connais aucun moyen simple de vérifier le code.) Vraisemblablement, vous voulez reprendre sur un avertissement de mémoire, mais ceux-ci n'existent pas non plus). Notez également que vous pouvez obtenir les données JPEG brutes (sur certaines versions du système d'exploitation) via une notification; J'ai oublié quel est le nom, mais la clé userInfo est @ "AVCaptureNotificationInfo_JPEGData". Si vous enregistrez les données JPEG brutes, vous pourrez peut-être le traiter ultérieurement.

Je pense que UIImageWriteToSavedPhotosAlbum() décompresse bêtement le JPEG retourné par la caméra et le recompresse, mais je peux me tromper. Les images d'une caméra ne font qu'environ 1 à 2 Mo, donc vous devriez pouvoir en prendre beaucoup sans que ça ne plante, mais dans mes tests ce n'est pas le cas.

+0

ok, c'est vicié mais juste remarqué que je n'ai jamais accepté votre réponse.Vous m'avez définitivement mis sur la bonne voie. Merci! – XJones

Questions connexes