お絵かきアプリを開発中です。交差した線を描画すると、交点は、両方の線が互いに交差する以前に描画されたピクセルをクリアします。 setneedsdisplayinrect を使用して描画データを更新します。
この問題をどうやって乗り越えますか?
tl;dr:以前の線分を保存し、同じ長方形を再度描画するときに再描画する必要があります。
setneedsdisplayinrect を使用して描画データを更新しています
それは良いことです。それを行うことの副作用を見ることができますか?そうでない場合は、四角形全体を渡してみて、何が起こるかを確認してください。最後のセグメントだけが描画されていることがわかります。
これで、以前の線分 (またはそのイメージのみ) を保存し、場合によっては再描画する必要があることがわかりました。
最初の最も簡単な解決策は、すべての行を配列に格納して再描画することです。特にしばらく描画した後では、これによりアプリの速度が大幅に低下することに気付くでしょう。また、必要なものだけを描いてもうまくいかない
配列内のすべての行をフィルタリングして、更新された四角形と交差する行のみを再描画することにより、上記の実装を高速化できます。これは、たとえば、( を使用して) 線分の境界ボックスを取得し、( を使用して)CGPathGetBoundingBox(path)
更新された四角形と交差するかどうかを確認することで実行できCGRectIntersectsRect(refreshRect, boundingBox)
ます。
これにより、描画の一部が削減されますが、依然として非常に長い行の配列になり、しばらくするとパフォーマンスの問題が発生します。
以前の線分をすべて保存する必要がない良い方法の 1 つは、それらをビットマップ (別のイメージ コンテキスト (「 」を参照UIGraphicsBeginImageContextWithOptions(...)
)) に描画して、新しい線分を描画する前にそのイメージを描画することです。ただし、これを行うと必要な描画がほぼ 2 倍になるため、すべてのフレームに対して行うべきではありません。
できることの 1 つは、最後の 100 個の線分 (または最後の 1000 個または独自のパフォーマンス調査が示すものは何でも、これらを自分で調査する必要があります) を保存し、残りを画像に描画することです。100 本の新しい線を作成するたびに、最初に画像を描画してから新しい 100 本の線を描画して、それらを画像コンテキストに追加し、それを新しい画像として保存します。
もう 1 つできることは、ユーザーが指を離すたびに、すべての新しい線を画像に描画することです。これは、上記の提案と組み合わせてうまく機能します。
アプリの複雑さによっては、アプリの応答性を維持するためにこれらの提案の 1 つ以上が必要になる場合があります (これは描画アプリにとって非常に重要です) が、最初に調査し、必要がない場合はソリューションを過度に複雑にしないでください。 .