1

つまり、

[self setNeedsDisplayInRect:rect];

が呼び出され、rect再描画が必要な領域に対して非常に慎重に計算されますが、drawRectコードがすべてを気にせずrect描画しない場合でも、iOSシステムは描画速度を何らかの形で改善できますか?(またはおそらくほとんど改善しませんか?)この質問には、UIKit/CoreGraphicsに精通している人が必要になる可能性があります。

4

2 に答える 2

2

答えが「はい」になる方法はいくつかあります。

  1. 長方形にクリップすることができます。その場合、長方形を描画しても、長方形の外側はペイントされません。長方形の外側に描画するのは無料ではありませんが、安くなります。iOSは、意図的にrectを無視したり、rectを使用したりするだけでなく、無条件に境界内の他の場所に何かを描画する可能性があるため、これを行うことはできません。(ただし、他のことはおそらく別の見方であるはずです。)
  2. 現在 の長方形を使用していない場合でも、drawRect:後でそのコードに戻って最適化することができます。ご存知かもしれませんが、これを行うための非常に良い方法の1つは、可能であれば、長方形を使用して何を描くかを決定することです。現在それを行っていない場合でも、将来行う可能性があります。変更されたrectを指定すると、変更するものがはるかに少なくなります。
  3. #3の当然の結果として、現在描画しているものをそれほど最適化できない場合でも、将来のメジャーバージョンで、ビューが描画するものを可能なものに完全に変更することを決定する可能性があります。繰り返しになりますが、変更されたrectsを指定することは、将来行うべきことがはるかに少なくなることを意味します。
  4. サブビュー。ビューが実際にユーザーに表示されるものの一部を描画せず、(Cocoa / Cocoa Touchの意味ではなく)それらをサブビューに委任する場合は、オーバーライドしてサブビューにメッセージをsetNeedsDisplayInRect:送信できます。フレームがrectと交差するサブビュー—を呼び出す前。(そして、UIViewの実装はすでにこれを行っている可能性があります。テストする必要があります。)setNeedsDisplay:super
于 2012-04-23T07:35:23.410 に答える
1

drawRect:実装が渡されたrectを無視し、ビュー全体を描画する場合、渡されたrectの最適化は無効になりますsetNeedsDisplayInRect:

「needsdisplay」rectはまっすぐに通過します。そこにあるのは、drawRect:実装が不要な描画を無視するために使用することだけです。実装が入力されると、drawRect:渡された四角形の外側の描画が意図的なものであるかどうかをシステムが判断できないため、すべての描画が実際に行われます(パフォーマンスへの影響を含みます)。

描画する内容と方法によっては、渡されたrectを少なくともある程度使用するように実装を制限することはそれほど難しくありません。描画するdrawRect:すべてのものには、テキストのチャンクであろうとベジェパスであろうと、境界rectがあります。または画像または単にあなたがいくつかの色で塗りつぶしている長方形。テストで描画するために各ビットを囲みCGRectIntersectsRect()ます-その方法でパスされた四角形に描画を完全に制限することはありませんが、少なくともその四角形に触れないものは描画する必要がないようにします。

于 2012-04-23T07:34:27.473 に答える