UIImage drawInRect: очень медленно;Есть ли более быстрый способ? - PullRequest
7 голосов
/ 27 октября 2011

Это делает именно то, что нужно, за исключением того, что это занимает около 400 миллисекунд, что на 350 миллисекунд слишком много:

 - (void) updateCompositeImage { //blends together the background and the sprites
    UIGraphicsBeginImageContext(CGSizeMake(480, 320));

    [bgImageView.image drawInRect:CGRectMake(0, 0, 480, 320)];

    for (int i=0;i<numSprites;i++) {
        [spriteImage[spriteType[i]] drawInRect:spriteRect[i] blendMode:kCGBlendModeScreen alpha:spriteAlpha[i]];
    }

    compositeImageView.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
}

Изображения довольно маленькие, их всего три (цикл for повторяется только дважды)

Есть ли способ сделать это быстрее? Пока еще есть возможность использовать kCGBlendModeScreen и alpha?

Ответы [ 2 ]

8 голосов
/ 27 октября 2011

Вы можете:

  • получить CIIImage UIImages
  • затем перетяните их в CGBitmapContext
  • создать изображение из этого

Использование CoreGraphics само по себе может быть быстрее. Другой бонус в том, что вы можете выполнять рендеринг в фоновом потоке. также подумайте, как можно оптимизировать этот цикл и профиль с помощью инструментов.

другие соображения:

  • Вы можете уменьшить качество интерполяции?
  • размеры исходных изображений изменяются любым способом (это может помочь, если вы измените их размер)
0 голосов
/ 29 ноября 2011

drawInRect идет медленно. Период. Даже на маленьких изображениях это крайне неэффективно.

Если вы выполняете многократное рисование, посмотрите на CGLayer, который предназначен для облегчения повторного рендеринга тех же битов

...