2010-10-05 2 views
0

В моей игре я хватаю изображение из библиотеки фотографий iPhone, используя UIImagePickerController, который возвращает UIImage. Поскольку изображение является огромным разрешением (1536x2048), этот UIImage занимает почти 20 МБ в памяти. Чтобы решить эту проблему, я значительно уменьшаю изображение, прежде чем использовать его для создания спрайта, и это уменьшает объем памяти. Тем не менее, есть краткий момент до того, как изображение будет изменено, что мое использование памяти будет очень высоким, и я беспокоюсь, что это может привести к сбоям в ситуациях с низкой памятью (хотя я не получаю никаких предупреждений о низкой памяти). У кого-нибудь есть идеи о том, как справиться с этим сценарием?UIImage из библиотеки фотографий очень большой

Спасибо!

ответ

0

Я могу точно подтвердить, что вы говорите: UIImagePicker - это довольно короткий момент его жизни, массивный RAM hog.

Все, что я могу вам сказать, это очистить как можно больше памяти на вашем пути. Мне удалось свести к минимуму сбой, отбросив все остальные изображения, которые у меня есть в памяти, и загружать их обратно после того, как я поймаю и изменю размер UIImage I вернулся из Пикера.

Единственное РЕАЛЬНОЕ решение, которое я нашел, - это сделать себе iPhone 4. У него достаточно памяти для справки. Мой бедный старый 3G был очень легко раздавить с UIImagePicker.

+0

получить iPhone 4.nice: D мне, возможно, понадобится, чтобы получить меня один из них. – Pavan

+0

Знаете ли вы, что это как-то ошибка самого UIImagePicker, или если это связано с размером изображения? –

+0

@stefan_g. Это функция изображения, которое загружает UIImagePicker, но нет необходимости останавливать его при загрузке гигантского изображения, если захочет. Вытягивание изображений с камеры также является громоздким делом ... Лучшая политика - это как можно больше выйти из своего пути. –

1

Посмотрите на этом он говорит о изменении размера изображения и так далее правильно:

https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more

Сво большой учебник по FAQ по UIImagePickerController, UIImage, память и многое другое.

EDIT:

предупреждения памяти чрезвычайно распространены при работе с UIImagePickerController. Это особенно актуально при использовании камеры. Имейте в виду, что, хотя JPG или PNG на диске может составлять всего несколько МБ, несжатое битовое изображение в памяти, используемое для рисования изображения, использует значительно больше.

Там нет ничего, что вы делаете неправильно обязательно, но некоторые усовершенствования могут быть сделаны:

Вместо того, чтобы хранить байты изображения в Core Data, почему бы не записать образ на диск и сохранить путь к файлу в вашей базы данных?

, и если вы используете авторекламу, а не используете так много автореализованных изображений, можете ли вы найти способ управлять своим жизненным циклом напрямую и освободить их раньше?

Ваш лучший выбор - это записать изображения на диск как можно скорее после их обработки и освободить память, которую они используют. Затем сохраните свое местоположение с использованием Core Data вместо исходных данных.

Или даже удалить все загруженные изображения, сохранить их на диск, загрузить новое изображение, затем сохранить на диск, а затем загрузить изображения по пути. что-то вроде того.

вы можете некоторые модифицированный код следующим образом: Getting crash after picking images from UIImagePickerController (Related to memory leak?)

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

    [self dismissModalViewControllerAnimated:YES]; 

    if (object.imagePath != nil) { 
     [self deleteImages]; 
    } 
    dispatch_queue_t image_queue; 
    image_queue = dispatch_queue_create("com.gordonfontenot.app", NULL); 

    dispatch_async(image_queue, ^{ 

     NSDate *now = [NSDate date]; 

     NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
     [f setDateFormat:@"yyyyMMDDHHmmss"]; 

     NSString *imageName = [NSString stringWithFormat:@"Image-%@-%i", [f stringFromDate:now], arc4random() % 100]; 
     NSString *thumbName = [NSString stringWithFormat:@"%@-thumb", imageName]; 

     [f release]; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
     NSString *thumbPath = [documentsDirectory stringByAppendingPathComponent:thumbName]; 

     NSData *thumbImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerEditedImage"] toSize:CGSizeMake(120, 120)]); 
     [thumbImageData writeToFile:thumbPath atomically:NO]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      object.thumbPath = thumbPath; 
      [self setupImageButton]; 
      imageButton.enabled = NO; 
      [self setupChooseImageButton]; 
     }); 
     NSData *fullImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"] toSize:CGSizeMake(800, 600)]); 
     [fullImageData writeToFile:fullPath atomically:NO]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      imageButton.enabled = YES; 
      object.imagePath = fullPath; 
     }); 

     if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { 
      UIImageWriteToSavedPhotosAlbum([info objectForKey:@"UIImagePickerControllerOriginalImage"], self, nil, nil); 
     } 

    }); 
    dispatch_release(image_queue); 
} 

Надеюсь, у вас есть достаточно информации, чтобы идти дальше отсюда.

PK

+0

Да, это точный урок, с которого я снял код изменения размера. Он не упоминает, что делать с всплеском памяти :( –

+0

Это хороший учебник, но еще есть момент, когда изображение, которое возвращается, очень велико, и ничего не поделаешь, но отталкивайте блюда table –

+0

ok ive обновил сообщение после того, как сделал исследование som и сделал несколько вариантов из разных вопросов и нашел что-то, что вы можете сделать сейчас, так как вы не можете делать что-либо еще напрямую, как вы хотите, чтобы он работал. – Pavan

Смежные вопросы