1

サーバーから受信したデータに基づいて線を描画する必要があり、新しいポイントを受信するたびにすべてを再描画することを避けようとしたため、次のことを考えました。

  1. 再利用CGContextRefして新しいポイントの線のみを描画する、または
  2. パスにポイントの新しい行を使用UIMutablePathして追加し、パスをストロークします

しかし、私は問題を見つけました:

  1. 再利用CGContextRefが機能しないのはなぜですか? (つまり、メソッドUIGraphicsGetCurrentContext()drawRectに入れることはできますが、メソッドの外で保持して使用することはできません)
  2. を使用してパスを再描画するのと同じくらい効率が悪いCGContextRefですか?

ありがとう!

4

2 に答える 2

2

経由で取得したグラフィックス コンテキストを再利用しようとしないでくださいUIGraphicsGetCurrentContext()。サポートされていないため、動作が不安定になります。

drawRect を繰り返し呼び出すことでパフォーマンスの問題が発生している場合は、次の 2 つの方法が役立ちます。

  1. setNeedsDisplay を呼び出す頻度を減らします。ネットワーク データが急速に受信される場合、新しいデータが受信されるたびに NSTimer を設定できます。たとえば、0.5 秒以上後にタイマーが起動するようにします (何が賢明かは、私よりもよくわかります)。タイマーが起動する前に新しいデータが入ってきた場合は、タイマーをリセットします。新しいデータが到着せずにタイマーが起動した場合は、setNeedsDisplay を呼び出します。これにより、描画呼び出しが抑制されます。

  2. 描画コードが非常に高価な場合は、UIGraphicsBeginImageContext と UIGraphicsEndImageContext 呼び出しを使用してバックグラウンド スレッドに移動し、その間に描画を行い、そのコンテキストを UIImage にレンダリングし、完了ブロックを介して UIImage をメインに戻すことができます。列。次に、その画像を drawRect で描画するか、UIImageView の画像プロパティとして使用できます。

于 2013-09-17T18:17:48.030 に答える
1

再利用できない理由は、短期間でコミットされるバッファーに描画しているためです。その時までに、変更を加えるには遅すぎます。

パス全体を再作成することは、受け取ったポイントの数と頻度に基づいて非常に非効率になる可能性があります。可変パスの再描画はかなり安価です。したがって、可変パスをどこかに保存し、それにポイントを追加するたびに、setNeedsDisplayまたは何かを使用して再描画する必要があります。実際にプロファイリング/測定を行い、非効率的であることが判明するまで、このアプローチのパフォーマンスについて心配する必要はありません。

于 2013-09-17T18:15:41.340 に答える