2013-10-03 5 views
0

У меня есть приложение с 150 локальными изображениями (около 500 кб каждая). Я загрузил их все в массив так:Предварительная загрузка изображений Приложение iOS

allPics = [[NSMutableArray alloc] init]; 

//NSString *imagePath; 
NSArray *result = [database performQuery:@"SELECT image_path FROM validWords order by valid_word"]; 
for (NSArray *row in result) { 
    NSString *temp = [row objectAtIndex:0]; 
    NSLog(@"%@", temp); 
    //imagePath = temp; 
    UIImage *newImage = [UIImage imageNamed:temp]; 

    [allPics addObject:newImage]; 
} 

Когда я установил свой UIImageView позже к одному из этого фото, она висит мой интерфейс на секунду, из-за отложенную загрузку от того, что я прочитал. Я пытался прервать их, но это увеличило мою память до более чем 3 ГБ, прежде чем он получил третью часть моих изображений. Должен ли я искать фоновый поток для рендеринга изображения, когда мне это нужно? Когда я уменьшил общее количество изображений до 4, как только все 4 были отображены один раз, переходы между ними были бесшовными.

Я ценю любые советы и решения!

ответ

1

Да, я бы предложил фоновый поток и пейджинг. Если пользователь смотрит на изображение 7, вы должны загружать изображения, скажем, 5,6,8 и 9. Если затем пользователь переходит на изображение 8, вы можете сбросить изображение 5 и ленивое изображение загрузки. Таким образом, пользователь должен быть способный перемещаться по вашим изображениям без значительных затрат памяти или производительности.

Вы можете также добавить эвристики, такие как «если пользователь пролистывания изображений очень быстро, не загружать любые изображения, пока они не замедлится»,

Другой наконечник должен хранить очень низкую версию разрешения изображения (скажем, версии 50 кб) и сохранить это на другом пути. Затем вы можете отображать миниатюрные изображения пользователю и только ленивую загрузку изображения с высоким разрешением, если пользователь останавливается на этом изображении в течение определенного периода времени.

И, наконец, будьте осторожны, когда говорите о размерах изображения. Является ли сжатие или несжатие 500 КБ? Если это сжатый JPG на 500 Кбайт, фактическое изображение на устройстве может быть значительно больше. Jpg с довольно однородным цветом и достаточно высоким уровнем сжатия может быть очень маленьким на диске, но распаковать его может быть массивное изображение. Это может быть еще одним источником запаздывания, которое вы испытываете.

+0

500kb на диске, разрешение 6000x6000. Изображения были сделаны графическим художником, и я уменьшаю их до 400 x 400 на не сетчатой ​​оболочке ipad. Являются ли эти процессы масштабирования, добавляя много избыточных затрат к рендерингу? – Teknos

+0

WOW. хорошо, там есть ваша проблема. 6000x6000 является массивным в памяти. Представьте, что вы используете 8 бит информации для красных, зеленых, синих и альфа-каналов. это означает, что у вас есть 6000x6000 пикселей, где каждый пиксель занимает 4 байта (обычно используемый размер). это 144000000 байт пространства, необходимого для представления изображения на диске перед масштабированием. Мой совет, предварительно масштабируйте изображение до 400x400, прежде чем наложить его на устройство. Хорошее эмпирическое правило состоит в том, чтобы всегда готовить, если можете. – Bergasms

+0

В зависимости от того, как вы обрабатываете масштабирование, IOS будет обрабатывать масштабирование, не загружая сразу все изображение в память, но это даст вам накладные расходы, которые вы испытываете. – Bergasms

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