フィンガー ペインティング (私のアプリ) には UIBezierPath を使用します。path = [UIBezierPath bezier path]; を使用して作成します。. iPad では常に遅れます (そして drawrect 内から呼び出しても何も変わりませんでした)。私はこれに何時間も取り組んできましたが、解決策は見つかりませんでした。誰か私を助けてくれませんか?また、NSTimer を使用して関数を呼び出しています。それは私のアプリが動作する古い方法ですので、このラググを修正するのを手伝ってください!!!!!
2 に答える
あなたの質問にはどれも十分な詳細が含まれていないため、不適切なことをして、現在の最後の5 つの質問に対するメタ回答を投稿します 。
まず、引き込み、他にはdrawRect:
何もありません。
大事なことなのでもう一度言います。
引き込み、他にはdrawRect:
ありません。
違いtouchesMoved:withEvent:
ます。
または。touchesBegan:
_Ended:
drawRect:
そして他にはありません。
ファイルに保存する画像を作成している場合、それは 1 つのことです。ただし、画面に描画するときは、以外の場所では行いませんdrawRect:
。
真剣に。それはとても重要です。
ステップ 2:描画を強制的に実行しようとしないでください。
drawRect:
絵を描く時間になると呼び出されます。定義上、それ以外の場合は描画する必要がないため、描画は必要のないことを行っていることになります。ひいては、自分自身を呼び出さないでdrawRect:
ください。その必要はありませんし、何の役にも立ちません。
実際には、これは手順 1 の拡張に過ぎません。 をdrawRect:
呼び出す場合は、呼び出し先に描画コードがある場合と同じです。描画コードはどこでも繰り返されるわけではありませんが、これは良いことですが、まだ間違ったタイミングで実行されています。システムが呼び出したときにのみ呼び出されるようにします。drawRect:
setNeedsDisplay
システムに描画する時間であることを伝えるために存在します。描画する必要がある何かが変更された場合にのみ、これを行う必要があります。ビューのプロパティ、モデル内の何か —描画するものsetNeedsDisplay
が変更されるたびに、自分自身を送信します。それ以外のときは行わないでください。その必要はありません。
タイマーを切り取ります。あなたはそれを必要としません。とにかく、タイマーがすでに配置されており、60 fps に制限されています。
Core Graphics は遅れません。いいえ、そうではありません。遅さまたは「ラグ」は、やりすぎているか、何か間違ったことをしているために発生します。
不必要にキャッシュしないでください。あなたがしていることは、画像キャッシュを必要としません。
touchesMoved:withEvent:
「ラグ」は、 and/or touchesBegan:
/から描画しようとしている、または描画を強制しようとしているためですEnded:
。上記を参照。
必要な作業は次のとおりです。
//メソッド、touchesBegan:
または必要に応じて他のレスポンダー メソッドで、状態を更新します。これには、ベジェ パスが含まれます。描画しないでください。これには、呼び出しを行わないか、描画を強制しようとする試みが含まれます。Moved:
Ended:
drawRect:
状態を更新した後、更新した場合にのみ、自分自身を送信しますsetNeedsDisplay
。
あなたのdrawRect:
方法で、そしてあなたの方法でのみdrawRect:
、パス、グラデーションなどを描きます。
これらのことを行うと、アプリケーションが高速になります。コアグラフィックス搭載。ラグなし。
また、いくつかの重要な読み物:
- iOS のプログラミング ガイドを表示
- Drawing … iOS用プログラミングガイド
- Quartz 2D (コア グラフィックス) プログラミング ガイド
- パフォーマンスの概要(一部は Mac OS X 固有ですが、その多くは iOS にも関連しています)
- 機器ユーザーガイド
ユーザーイベントへの応答に基づいてビューを再描画する必要がある場合、定期的に再描画するためにタイマーを使用しないでください。
代わりに、ビューの一部を再描画する必要があるタッチを使用するsetNeedsDisplay
か、タッチを受け取ったときにビューを無効にします。setNeedsDisplayInRect:
複雑なタッチ ドローイングの iPad アプリは、リアルタイムでレンダリングするよう要求するのが大変な場合があります。特に過剰に描画している場合はそうです。必要な時だけ描く。
別のオプション: レイヤーで作業する
おそらくアプリには元に戻す機能がないため、実装は簡単なはずです。画像を定期的に単一のビューに合成します。draw rect が呼び出されると、描画するパスが少なくなります (1 つの大きな画像 + 少ないパス)。その場合、キャッシュされたバッキング ビットマップが確実に役に立ちます。
繰り返しになりますが、あなたの投稿には詳細があまり含まれておらず、プロファイラーが何を示しているかを私たちに伝えていません.