drawRect()は、単に描画コードを実行するためのフックを意味しますか?
これは、現在のグラフィックスコンテキストスタックを使用して、渡された領域(rect)を再描画することを目的としています。もういや。
または、この方法は、「損傷」していて再描画が必要な領域も再描画することになっていますか?
いいえ。ダーティリージョンがオーバーラップしていない場合、drawRect:
異なるrectが渡されたの複数の呼び出しを受け取る可能性があります。を使用すると、rectは無効になりsetNeedsDisplayInRect:
ます。ビューのサーフェスの一部のみを再描画する必要がある場合は、描画するときにその部分を描画するように求められます。
自分のものを一度描画してから「スティック」することはできますか、それともdrawRect()を使用していつでもシーン全体を再描画する必要がありますか?
「くっつかない」。アプリの実行中にrectが無効になり、View Systemが画面を更新する必要があるときに、これらのrectを再描画するように要求されます。要求されたrectのみを再描画します。
場合によっては、単純な実装では、一部が無効になるたびに、ビューのrect全体が(かなり怠惰に)無効になることがあります。これは通常、必要以上の描画が必要であり、ビューが不透明でない場合は特に無駄になるため、通常は問題です。
JavaのGraphics2Dオブジェクトはこのように機能します。paint()が呼び出されるたびに「イメージ」全体を描画する必要があるため、いつでも再構築(またはキャッシュ)する準備をする必要があります。
AppKitやUIKitではそうではありません。
簡単な描画プログラムをどのように実装しますか?ユーザーが描いた各線/点/ストロークを「記憶」し、drawRect()が呼び出されるたびにそれを複製する必要がありますか?
ビューを描画するために必要なコンテキスト(たとえば、各線/点/ストローク)を覚えておく必要があります。要求された領域を描画するだけで済みます。技術的には、グラフィックシステムは、その長方形の外側に描画しても文句を言わないでしょうが、それはアーティファクトにつながる可能性があります。
複雑なレンダリングの場合、外部バッファ(ビットマップなど)に描画してから、事前にレンダリングされたビットマップ表現を使用して、画面に表示する方が簡単または効率的drawrect:
です。(レイヤーに関するブラッドの回答も参照してください)
「オフスクリーン」レンダリングはどうですか。すべての描画を行ってから、[self setNeedsDisplay]を呼び出して、書き込みを画面にフラッシュすることができますか?
はい、できます。具体的には、外部バッファー(ビットマップなど)にレンダリングします。ビットマップへのレンダリングが終了したら、描画する四角形を無効にしてから、drawRect:
が呼び出されたときにビットマップのデータを使用して画面に描画します。
ユーザーのタッチに応じて、ユーザーがタッチした画面に「X」を付けたいとしましょう。Xはそこにとどまる必要があり、新しいタッチごとに別のXが生成されます。これらのタッチアップ座標をすべて覚えてから、drawRect()ですべて描画する必要がありますか?
さて、あなたにはいくつかの選択肢があります。あなたの提案は1つです(あなたがあなたに渡されたrect内に描くと仮定します)。もう1つは、「X」ビューを作成し、それらのXを起動間も維持する必要がある場合は、ビューを再構築するために必要なポイントを覚えておくだけです。多くの場合、複雑な問題を簡単にレイヤーに分割できます(単純な2Dゲーム)。
- 1)地平線のある背景画像。
- 2)頻繁に変更されないフォアグラウンドのいくつかのもの。
- 3)ユーザーがゲーム内を移動するために使用するキャラクター。
したがって、ほとんどの問題は簡単に分割できるため、常にすべてをレンダリングする必要はありません。これにより、複雑さが軽減され、適切に実行された場合はパフォーマンスが向上します。うまく行かないと、さらに悪化する可能性があります。