iPad 3 renderInContext медленный - плохая производительность рендеринга

Я пытаюсь получить изображение из вида, где пользователь может рисовать, или добавить некоторые другие виды. С iPad1 & 2 пока все работает нормально. Но на iPad3 он работает как собака. Я просто использую метод Layers renderInContext.

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
    UIGraphicsBeginImageContextWithOptions(self.viewDrawableViewContainer.frame.size, NO, [UIScreen mainScreen].scale);
else
    UIGraphicsBeginImageContext(self.viewDrawableViewContainer.frame.size);
[self.viewDrawableViewContainer.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();   

Я знаю, что это, вероятно, вызвано процессором, который равен ipad2, но это занимает около 1 секунды. Чем больше пользователь рисует или добавляет, тем больше времени потребуется для рендеринга. Иногда до 5 секунд, что действительно недопустимо. Так есть ли варианты для улучшения производительности? Любой шанс, возможно, установить меньшее качество рендеринга - мне не нужен рендеринг в самом высоком разрешении сетчатки...

Буду признателен за любую помощь! заранее спасибо

2 ответа

Решение

Вы можете увеличить скорость рендеринга в более низком разрешении. Используйте масштабный коэффициент UIGraphicsBeginImageContextWithOptions менее 1,0, например 0,5.

Кроме того, если вам не нужна альфа, вы можете получить небольшое повышение скорости, передав YES для непрозрачного флага. Я сам не рассчитал разницу.

Вы также можете увеличить скорость рендеринга, изменив качество интерполяции в своем контексте перед вызовом рендеринга в контексте. С этим изменением я смог получить гораздо более высокую скорость скриншота, чем при изменении масштабного коэффициента.

Конечно, вы можете использовать и то, и другое, и вам не нужно устанавливать качество на None, Low все равно стал для меня улучшением.

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);

Кроме того, для коэффициента масштабирования, как упомянуто в предыдущем ответе, убедитесь, что ваш новый коэффициент масштабирования кратен оригиналу, т.е. если масштаб экрана равен 1,0, вы должны сделать что-то вроде.5, а не 0,8. Использование.8 приведет к тому, что рендер будет вычислять больше информации (потому что это не четный масштаб) и, следовательно, сделает это медленнее, чем при использовании 1.0, потому что.

Конечно, это не будет хорошим решением для всех.

Другие вопросы по тегам