2012-07-11 80 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