CGContext медленно в iOS5 - PullRequest
       17

CGContext медленно в iOS5

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

Я использую CGContext в два этапа: сначала создайте контекст, нарисуйте фоновое изображение, нарисуйте с помощью UIBezierPaths, затем получите изображение и отпустите контекст.Во-вторых, объедините это изображение с другим, как это:

UIGraphicsBeginImageContextWithOptions(self.anchorImage.size, NO, 1);
[self.anchorImage drawInRect:CGRectMake(0, 0, self.anchorImage.size.width, self.anchorImage.size.height)];
[tempImage drawInRect:CGRectMake(0, 0, self.anchorImage.size.width, self.anchorImage.size.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Это хорошо работает в iOS4, однако в iOS5 оно работает очень медленно (я тестирую на 3GS).Я делаю что-то неправильно?Или есть более оптимальный способ сделать это?Или есть определенный способ iOS5 сделать это?

1 Ответ

2 голосов
/ 06 февраля 2012

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

Вместо UIGraphics* я бы использовал CGBitmapContextCreate в сочетании с CGBitmapContextCreateImage. Когда ваше окончательное изображение будет сгенерировано, обновите представление изображения (или сделайте все, что вы хотите сделать с изображением).

dispatch_async(your_async_queue, ^() {
    CGContextRef ctx = CGBitmapContextCreate(/* params */);

    // your drawing

    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGContextRelease(context);

    dispatch_async(dispatch_get_main_queue(), ^() {
        // do something with image on the main thread
    });
}

Полный список сигнатур метода см. В документации CGBitmapContext .

...