2012-07-11 7 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の1、 に等しいですが、それは約1秒かかり、CPUによって引き起こされる知っています。ユーザーがペイントまたは追加するほど、レンダリングに時間がかかります。時には5秒までは実際には受け入れられません。 パフォーマンスを向上させるオプションはありますか? レンダリングの品質を低く設定する可能性があります。最高の網膜解像度でレンダリングする必要はありません。

私は助けていただきありがとうございます!事前に感謝します

+1

どのようなビューが描画されるのでしょうか?もしそうなら、あなたはバックグラウンドで描画を行い、結果をキャッシュすることができますが、これはデバイスをフリーズしません。 –

+0

ヒントのおかげで、私はバックグラウンドで画像を作成することができましたが、問題は、ユーザーがテキストを書いてタップすることです。その後、私は移動をタップした後にビューが閉じられるので、ユーザーのやりとりの直後に図面を作成する必要があります。しかし、ありがとう、おそらく、私は終了アニメーションが実行中にレンダリングすることができます。私はそれを試してみましょう...だから、レンダリングのパフォーマンスを向上させる他の方法はありません? – Alexander

+0

不幸にも、多くのピクセルと本質的に同じCPU上で4回チャーティングするだけでは、パフォーマンスが低下します。アニメーションでそれをマスクすることは、問題を解決するための素晴らしい方法であり、Appleがそれをどうやって行うのかです。 ユーザーがビューに描画することを許可している場合は、何を描画していますか?ビューをコンテキストにレンダリングするのではなく、ただちに引き出すことができるビューを裏付けるUIImageはありませんか? –

答えて

9

低解像度でレンダリングすることで速度を上げることができます。 1.0より小さいUIGraphicsBeginImageContextWithOptionsの倍率を使用します(例: 0.5。

また、アルファを必要としない場合は、不透明フラグにYESを渡すことでスピードを少し上げることができます。私は自分自身で違いをタイムリーにしていない。

+0

これを試しました。私は使用しました NSDate * d1 = [NSDate date]; ... NSDate * d2 = [NSDate date]; [d2 timeIntervalSinceDate:d1]; にかかる時間を測定し、差はありません。 iPad 3のほうがはるかに遅いです。iPad2 (〜0.3秒~1.7秒) – Nadav

16

コンテキスト内のレンダリングを呼び出す前に、コンテキスト内の補間品質を変更して、レンダリングの速度を上げることもできます。私は、スケールファクタを変更するよりも、この変更ではるかに高速なスクリーンショットを取得することができました。

もちろん、両方を使用することができ、品質を[なし]に設定する必要はありません。ローは改善されました。

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone); 

また、スケールファクタのために前の回答では、画面のスケールを使用すると、0.5とない0.8のような何かを行う必要が1.0であれば、あなたの新しいスケールファクタは、つまり、元の倍数であることを確認して述べたように。 .8を使用するとレンダリングでより多くの情報が計算されます(偶数の尺度ではないため)1.0を使用するよりも速度が遅くなります。

もちろん、これは皆にとって良い解決策ではありません。

+2

「CGContextSetInterpolationQuality」はすばらしいことです!私の場合は、セル内に画像を持つ 'UICollectionView'のレイヤーをレンダリングしています。スクロールが非常に大きくなると、高い補間品質を中/低のフレームレートに変更します。 – brigadir

関連する問題