Декомпрессия UIImage вызывает задержку прокрутки

У меня есть это приложение с полноэкранным tableView, которое отображает кучу крошечных изображений. Эти изображения извлекаются из Интернета, обрабатываются в фоновом потоке, а затем сохраняются на диск с помощью чего-то вроде :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
    // code that adds some glosses, shadows, etc 
    UIImage *output = UIGraphicsGetImageFromCurrentImageContext();

    NSData* cacheData = UIImagePNGRepresentation(output);
    [cacheData writeToFile:thumbPath atomically:YES];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.image = output; // refreshes the cell using KVO
    });
});

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

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    UIImage *savedImage = [UIImage imageWithContentsOfFile:thumbPath];

    if(savedImage) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.image = savedImage; // refreshes the cell using KVO
        });
    }
});

. Моя проблема в том, что в первом случае прокрутка плавная. Но во втором случае (, когда он считывает изображение непосредственно с диска ), прокрутка происходит очень рывками, даже после загрузки изображения. Рисование - вот что вызывает отставание. Используя инструменты, я вижу, что copyImageBlockSetPNG, png_read_nowи inflateзанимают большую часть процессора (, они не при назначении self.imageна UIGraphicsGetImageFromCurrentImageContext())

. Я предполагаю, что это происходит, потому что в первом случае UIImage — это необработанный вывод рисунка, тогда как во втором случае он должен распаковывать PNG каждый раз, когда рисует его. Я попытался использовать JPG вместо PNG, и я получил аналогичные результаты.

Можно ли это исправить? Может быть, чтобы он распаковывал PNG только при первом рисовании?

29
задан samvermette 13 April 2012 в 22:33
поделиться