2012-04-11 10 views
2

私のアプリには、「メイン」ビュー、カスタムサムスティックコントロール、およびいくつかのボタンがあります。メインビューには追加のCALayerが定義されています。このCALayerのコンテンツは常にストリーム画像で更新されます。いくつかは、コード:にCADisplayリンクを設定バックグラウンドが頻繁に更新される遅延UI

が繰り返し私のdrawメソッドを呼び出します。

displayLink_ = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawSublayers)]; 
[displayLink_ setFrameInterval:2]; 
[displayLink_ addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 

方法drawSublayersは問題が親指スティックや他のコントロールつまり

CGImageRelease((__bridge CGImageRef) imageLayer_.contents); 
    [imageLayer_ setContents:(id)self.cameraImage_.CGImage]; 

としてCGImageを描きますすべて非常に遅れている。これは、バックグラウンドイメージの描画が、mainRunLoopがドラッグダウンして追いつくことができないほど十分なプロセッサを食べるためです。私が読んだすべての投稿は、UIアップデートを個別のスレッドに移動すると機能しないことを示唆しています(独立テストでこれが確認されました。メソッドは起動しますが、描画は発生しません)。

アイデア?背景画像は優先順位ではなく、すなわち、描画するのに時間がかかることは気にしない。私はちょうどそれがUIの残りの部分と干渉しないようにしたい。

+0

(もちろん、原子を!)だけが行う' _imageLayer.contents = <あなたの-property> 'メインスレッドのビット?スローダウンがカメラからの画像を取得しているのか、UIを更新していますか? (私はカメラを疑っています) – deanWombourne

+0

これは、すべてを遅らせるsetContentsの呼び出しです。それは画面の再描画を強制します。これは、他のすべてを遅くするのに十分なCPUを食べます。 – ayrton04

+0

'[imageLayer_setContents:(id)self.cameraImage_.CGImage];を' self.cameraImage_.CGImage'だけに置き換えれば、減速しないでしょうか? – deanWombourne

答えて

2

メインスレッドから図面を移動します。あなたがバックグラウンドスレッドで `self.cameraImage_.CGImage`を入れて、プロパティにそれを保存するとどうなりますかperformSelectorinBackground:

http://www.chrisumbel.com/article/asynchronous_iphone_nsthread_nstimer

+0

スレッドセーフではないUIアクションはどうですか? 'imageLayer_.contents = ... 'をメインスレッドで行うべきではありませんか? – deanWombourne

+0

これはUIに関係しません。それはちょうどカメラの画像を描画します。 –

+0

これはまだ画像を描画しますが、描画ははるかに遅れていますが、(何らかの奇妙な理由により)まだ他のコントロールの遅れを止めていません。私がイメージを完全に描くのを止めれば、他のコントロールがはるかに反応します。それが原因だと思います。 – ayrton04

関連する問題