2010-08-11 1 views
2

Я пишу приложение, которое использует UIImagePickerController, чтобы делать несколько снимков с камерой так же быстро, как позволяет iOS. Мое приложение должно запускаться на iOS 3.13 на всех версиях оборудования iPhone (с v1 по 4). Я использую UIImagePickerController с камеройOverlayView.Как проверить, достаточно ли памяти для обработки снимка, снятого UIImagePickerController, при съемке нескольких фотографий с помощью камеры?

Мой вопрос в том, как определить программно, сколько фотографий можно обрабатывать сразу на основе доступной памяти? Подробности смотрите ниже. Любая помощь приветствуется!

Когда делегат imagePicker получает imagePicker: didFinishPickingMediaWithInfo :, делегат сохраняет изображение полного размера в сохраненном фотоальбоме с помощью UIImageWriteToSavedPhotosAlbum(). Как только я решил эту проблему, приложение будет делать больше вещей с полным размером изображения.

В качестве теста я фотографирую как можно быстрее. В конце концов, как и ожидалось, приложение получает предупреждение о памяти из-за большого количества фотографий в памяти при сохранении в фотоальбоме. Если я игнорирую предупреждения о памяти и продолжаю фотографировать, в конечном итоге приложение будет убито iOS b/c.

У меня нет проблем с установкой ограничения на количество одновременных фотографий, которые я разрешаю приложению обрабатывать одновременно. Каждая версия iPhone HW имеет разную емкость памяти и различные разрешения камеры. С iOS 4 многозадачность может также влиять на доступную память. Я предпочел бы сделать это программно, чем жесткий код, на основе версии HW.

тест приложение, которое показывает такое поведение в Source Code

+1

Я решил это с помощью подклассов NSOperationQueue и NSOperation для управления обработкой изображений (op делает больше, чем просто сохраняет в фотоальбоме). Управление очередью осуществляется путем ограничения количества параллельных операций (на основе iPhone HW), приостановки очереди на предупреждениях памяти и возобновления очереди, когда нет выполнения ops (для подзапроса требуется подкласс NSOperationQueue). На iPhone v1 я могу быстро взять> 25 фото, и приложение работает отлично. Конечно, для завершения обработки требуется много времени. – XJones

ответ

3

Это легче жестко закодировать предел.

Нет простого способа узнать, что такое «доступная память», так как при внезапном освобождении памяти может появиться свободное сообщение, или если телефон решает убить различные фоновые приложения (а именно Safari). Существует NSRealMemoryAvailable(), но это может просто вернуть установленную оперативную память (и, вероятно, это использует [NSProcessInfo physicalMemory]).

Вы можете попробовать сохранить изображения в очереди - сохранение одного изображения за раз, скорее всего, уменьшит объем памяти. Вы также можете добавить маркеры в свою очередь, когда вы получите предупреждение о памяти, и отключите сохранение изображений, когда их больше одного (в идеале вы хотите прекратить делать снимки, если вы получаете предупреждения о «уровне 2» или «уровне 3», но в то время как они печатаются на консоль, я не знаю, какой простой способ проверить код. Предположительно, вы хотите возобновить запись в память без предупреждения, но они также не существуют).

Также обратите внимание, что вы можете получить необработанные данные JPEG (на некоторых версиях ОС) посредством уведомления; Я забыл, что такое имя, но ключ userInfo - @ "AVCaptureNotificationInfo_JPEGData". Если вы сохраните необработанные данные JPEG, вы сможете обработать его позже.

Я думаю, UIImageWriteToSavedPhotosAlbum() глупо распаковывает JPEG, возвращаемый камерой, и повторно сжимает его, но я мог ошибаться. Изображения камеры составляют всего около 1-2 МБ, поэтому вы должны иметь возможность брать много, без сбоев, но в моих тестах это не так.

+0

хорошо, это устарело, но только что заметил, что я никогда не принимал ваш ответ.Вы определенно поставили меня на правильный путь. Благодаря! – XJones