Как я могу проверить, достаточно ли памяти для обработки снимка, сделанного UIImagePickerController, при съемке нескольких фотоаппаратов? - PullRequest
2 голосов
/ 11 августа 2010

Я пишу приложение, которое использует UIImagePickerController, чтобы делать несколько снимков с помощью камеры так быстро, как позволяет iOS.Мое приложение должно работать на iOS 3.13 на всех версиях iPhone (версии от 1 до 4).Я использую UIImagePickerController с cameraOverlayView.

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

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

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

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

Тестовое приложение, которое показывает такое поведение, имеет Исходный код

1 Ответ

3 голосов
/ 11 августа 2010

Легче жестко запрограммировать ограничение.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...