2012-07-11 62 views
6

我想从用户可以在其上绘制或添加其他视图的视图中获取图像。随着iPad1 & 2目前为止一切正常。 但在iPad3上它像狗一样运行。 我只是使用图层renderInContext方法。iPad 3 renderInContext slow - 糟糕的渲染性能

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一个, 的CPU引起的,但它需要大约1秒钟。用户绘画或添加的越多,呈现时间就越长。有时长达5秒,这是真的不能接受的。 那么有什么方法可以提高性能吗? 任何机会,也许设置一个较小的渲染质量 - 我不需要在最高的视网膜分辨率渲染...

我将不胜感激任何帮助!在此先感谢

+1

你能预测到将会绘制哪些视图吗?如果是这样,您可以在后台执行绘图并缓存结果,而不会冻结设备。 – 2012-07-11 14:46:41

+0

好的谢谢你的提示,我可以在后台创建一个图片,但问题是,用户可能会写一些文本,然后点击。然后,我将不得不在用户交互之后立即执行绘图,因为视图将在点击之后关闭。但是,谢谢,也许我可以在关闭动画执行时进行渲染。我会试一试......所以没有其他方法可以提高渲染性能? – Alexander 2012-07-11 15:03:16

+0

不幸的是,在基本上相同的CPU上搅动4次,因为许多像素只是简单地杀死了性能。用动画掩盖它是解决问题的好方法,也是苹果如何去做的。 如果您允许用户绘制一个视图,您正在绘制什么?是否没有UIImage支持视图,您可以立即撤出,而不是将视图渲染到上下文中? – 2012-07-11 15:07:08

回答

9

您可以通过以较低的分辨率渲染来提高速度。使用UIGraphicsBeginImageContextWithOptions小于1.0的比例因子,例如0.5。另外,如果你不需要alpha,你可能会通过传递YES来获得小的速度提升。我自己并没有计时。

+0

试过。我用 NSDate * d1 = [NSDate date]; ... NSDate * d2 = [NSDate date]; [d2 timeIntervalSinceDate:d1];要测量需要多长时间,并且没有区别。 iPad 3的速度远慢于iPad2 (〜0.3秒〜1.7秒) – Nadav 2013-01-02 12:51:52

16

在上下文中调用渲染之前,还可以通过修改上下文中的插值质量来提高渲染速度。通过改变比例因子,我可以获得更高速度的截图效果。

当然,您可以同时使用,而且您不必将质量设置为无,低仍然是对我的改进。

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone); 

而且,比例因子提到在以前的答案请确保您的新的尺度因子是原始的,即倍数,如果屏幕比例是1.0,你应该这样做1.5到不是0.8。使用.8会使渲染计算出更多的信息(因为它不是偶数比例),因此比使用1.0要慢。

当然,这不会是一个很好的解决方案。

+2

'CGContextSetInterpolationQuality'成就了美好的事物!在我的例子中,我使用单元格中的图像渲染'UICollectionView'图层 - 滚动显着时,将高插值质量更改为中/低帧率。 – brigadir 2013-11-04 15:29:14