1

私は現在、タッチメソッドのクワッドカーブを介して変更可能なパスに線を追加し、新しい領域でsetNeedsDisplayInRectを呼び出すフリーハンドのiPadアプリを持っています。

問題は、描画 (パス) がかなり大きくなり、再描画に時間がかかり、動きが鈍くなることです。ユーザーがブラシのサイズまたは色を変更するたびに、再描画時に以前に描画されたパスの重複部分にこれが適用されます。

これに対抗するために、touchesEnded のバックグラウンド スレッドで renderInContext を呼び出し、これを描画ビューの背後にあるイメージ ビュー内の別の UIImage とマージします。次に、描画ビューをクリアします。

これはまた、ユーザーが保存を押すと、描画は通常、単一の UIImage で既にレンダリングされているため、すぐに使用できます。

これは他のデバイスでは問題なく動作しますが、iPad 3 Retina ディスプレイではパフォーマンスが非常に悪く、ユーザーがすばやく描画するときに指を何度も離すたびにクラッシュする傾向があります。

この種の状況に対処するためのベスト プラクティスについて、何らかのアドバイスを求めていますか? バックグラウンドでレンダリングするビューを追加して、メイン スレッドとバックグラウンド スレッドが同時に同じビューにアクセスするのを防ぐことは別として (ハックのように聞こえますが)、死んだ馬を打ち負かしているように感じますか?

4

1 に答える 1

4

現在のアプリでは、パスの長さやパスの数に関係なく、iPad 2 と 3 で正常に動作する実用的な実装を作成しました。グラフィックカードは、いくつかの大きなパスよりも多くの小さなパスを描画する方が優れているようで、どちらも画像をコンテキストにレンダリングするよりも高速です。したがって、ユーザーが継続的に描画している場合でも、パスを多くの小さなパスに分割し、それらを配列に追加します。このアプローチには、1 つの利点と 1 つの欠点があります。

長所:画像を鮮明にズームして再描画できる機能
短所:ピクセル完全消去ができない

UIBezierPath複数の色に関しては、 color プロパティを含む のサブクラスを作成しました。色は を介し​​てシリアル化NSCodingできるようになったため、簡単に保存できます。さらに、ユーザーが 1 つの連続したストロークで作成したすべてのパスを保持する「ストローク」オブジェクトがあります。このようにして、元に戻す/やり直しを正しく処理できます。

この情報が役立つことを願っています。

于 2013-03-01T03:16:12.577 に答える