6

指を使って簡単な図を描くアプリケーションを書いています。ほとんどの部分で機能していますが、現在はパフォーマンスを最適化しようとしています。ユーザーが指をすばやくスワイプすると、スムーズなパスを描画するのに十分なタッチイベントをキャプチャできません。

これが私の現在のアプローチです:

1)UIViewをサブクラス化し、CGLayerにポロパティを追加しました(遅延して作成され、UIViewと同じサイズです)。2)私のUIViewサブクラスは、現在および最後のタッチポイントをインスタンス変数に格納することによってタッチイベントに応答します。3)ビューのsetNeedsDisplayが呼び出され、描画長方形で次の手順を実行します。-前のタッチ位置から現在のタッチ位置への線をCGLayerに描画します-CGLayer全体をビューコンテキストに一度に描画します

主な問題は、ユーザーが高速でスワイプするとタッチイベントが比較的少なくなるため、タッチ間に描画する線が長くなり、パスがギザギザに見えて滑らかにならないことです。

私の質問:

1)drawRect(UIViewサブクラス上)とUIViewサブクラス上のタッチイベントハンドラーは同じスレッドで呼び出されますか?つまり、スレッドを実行する必要がありますか(1つはタッチイベントで、2つ目は描画長方形で)?

いいえの場合-drawRectが呼び出されている間、タッチイベントはキューに入れられますか?そして、どうすればパフォーマンスを向上させることができますか?単にdrawRectのパフォーマンスを向上させるだけですか?

はいの場合-よりスムーズなパスを描画できるように、タッチイベントをさらに発生させるにはどうすればよいですか?

ありがとう。

4

5 に答える 5

4

もう 1 つの方法は、サンプル ポイント間の曲線を補間することです。指のドラッグが開始されたら、サンプル ポイントの収集を開始します。点数が増えたら線を引き直します。2 点で直線を描き、3 点以上で曲線を描きます。定義された距離内にある 2 つのポイントがサンプリングされたら、プロセスを再開できます。これにより、1 回の動作で 2 つの円弧 (「m」のような) を描くことができます。方向を変えるとき、途中で自然に一時停止します。これは、おそらく 2 つ以上のサンプルに十分な長さです。

于 2009-07-14T10:13:29.697 に答える
3

drawRect はメイン スレッドで呼び出されます。しかし、これを行う必要はありません。メイン スレッドを使用して UI イベントを収集し、バックグラウンド スレッドで描画を行うことができます。バックグラウンド スレッドは、新しいタッチがあるたびに通知を受け取り、独自の CGBitmapContext で描画操作を開始します。次に、CGImage を作成し、それを View: に渡しますview.layer.contents = drawingImage

さらにパフォーマンスが必要な場合は、OpenGL を使用した描画を検討してください。

于 2009-07-14T09:41:50.853 に答える
1

これを試しましたか?

http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007328-Intro-DontLinkElementID_2

于 2011-05-27T08:42:05.997 に答える
1

Aloo、私が同じ問題を抱えているので、彼の解決策を見つけましたか?また、すばらしいチュートリアルhttp://www.ipodtouchfans.com/forums/showthread.php?t=132024を見つけましたが、円などの高速で描画すると、描画があまりスムーズにならないという同じ問題もあります。それは、iPhoneが追いつけないようなものですが、残念ながら、これはコアグラフィックスのものを使用する必要があります。

于 2009-08-07T13:00:16.737 に答える
0

追加してみました

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound);

しかし、これは何もしませんでした。ベジェ曲線を計算する必要があるようです

于 2010-10-19T10:44:55.077 に答える