Принудительная загрузка изображений на iOS для предварительной загрузки - PullRequest
6 голосов
/ 10 февраля 2012

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

Как вы можете видеть из этого времени профилирования, изображения загружаются, когда они отображаются: enter image description here

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

- (UIImageView*)createAnimationForReel:(NSString*)reel ofType:(NSString*)type usingFrames:(NSInteger)frames{
    UIImageView *imageView = [[UIImageView alloc] init];
    NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:frames];

    for (int i=0;i<frames;i++){
        NSString *image;
        if(i<10){
            image = [NSString stringWithFormat:@"%@_0%i", reel, i];
        } else {
            image = [NSString stringWithFormat:@"%@_%i", reel, i];
        }
        NSString *path = [[NSBundle mainBundle] pathForResource:image ofType:@"png" inDirectory:type];
        UIImage *anImage = [[UIImage alloc] initWithContentsOfFile:path];
        [imageArray addObject:anImage];
    }
    imageView.animationImages = [NSArray arrayWithArray:imageArray];
    imageView.animationDuration = 2.0;
    return imageView;
}

И когда я читаю документацию, он говорит: «Этот метод загружает данные изображения в память и помечает их как очищаемые. Если данные очищаются и их необходимо перезагрузить, объект изображения снова загружает эти данные с указанного пути. " говорить о initWithContentOfFile. Так что мое изображение "должно" быть загружено.

Но нет.

Конечно, чего-то не хватает в моем отражении. Но что?

Ответы [ 3 ]

13 голосов
/ 20 октября 2012

Чтобы вызвать полную предварительную загрузку UIImage, вам нужно на самом деле нарисовать его, или так кажется. Например, используя:

- (void)preload:(UIImage *)image
{
    CGImageRef ref = image.CGImage;
    size_t width = CGImageGetWidth(ref);
    size_t height = CGImageGetHeight(ref);
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(space);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), ref);
    CGContextRelease(context);
}

Не красиво, но делает рисование изображения примерно в 4 раза быстрее. Я тестировал это с 1 МБ 640 × 1136 PNG на iPhone 4S:

  • Рисование без предварительной загрузки занимает около 80 мс.
  • Предварительная загрузка заголовка изображения занимает около 10 мс, но впоследствии не ускоряет рисование.
  • Предварительная загрузка данных, хотя поставщик данных занимает около 100 мс, но впоследствии вряд ли ускоряет рисование.
  • Предварительная загрузка рисунка, показанная в приведенном выше коде, занимает 100 мс, а следующая отрисовка - только 20 мс

Проверьте https://gist.github.com/3923434 для контрольного кода.

0 голосов
/ 19 июня 2015

Ответ Лео почти не дал мне никакого увеличения скорости загрузки. Эффект был заметен только тогда, когда я предварительно загружал одно изображение во второй раз сразу после первого. Например, если вы вызываете предварительную загрузку нажатием кнопки, первая предварительная загрузка дает увеличение примерно на 40 мс, если начальная загрузка составляет 200 мс. Это не так много.

Чтобы решить мою проблему, я просто создал скрытые imageViews и добавил их для просмотра иерархии, где мне нужна была предварительная загрузка. Следующая загрузка этих изображений заняла около 10 мс.

0 голосов
/ 10 февраля 2012

Можно было бы использовать каркас ImageIO (iOS 4.0+) и сделать что-то подобное:

...