私はCoreGraphicsをレンダリングに使用するペイントアプリケーションに取り組んでいます。私の問題は、パフォーマンスのために、変更されたビューの特定の部分のみに更新を制限しようとしています。そのために、私はsetNeedsDisplayInRect:を使用しますが、ビューがコンテンツ全体を更新し、吃音を引き起こすことがあります。これは第3世代のiPadsで特に顕著ですが、シミュレータとiPad2でも発生します。私はこの動作を削除しようとしています。setNeedsDisplayInRect:全体のビューを更新させます
問題を紹介するために、私はXcodeのテンプレートを使って簡単な「単一のビュー」プロジェクトを作成しました。 xibファイルでビューコントローラのビューとして設定したカスタムUIViewサブクラスを作成しました。
のUIViewControllerに追加この:MYVIEW(私のカスタムビュー)へ
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Asks that the view refreshes a smal rectangle
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 20, 20)];
}
追加この:
- (void)drawRect:(CGRect)rect
{
// Just log what is being updated
NSLog(@"%@", NSStringFromCGRect(rect));
}
そして、それはそれです。私が3番目のiPad(実際のデバイス)でアプリケーションを実行すると、ログは時々(非常に頻繁に)エントリーで再描画されます。これはとてもイライラしていて、私はアイデアがありません
更新:ここにいくつかのログがあります。時々更新される完全なビューを示しています。私はまた、
2012-05-04 08:34:01.851 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.184 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.197 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.215 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.226 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.242 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.258 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.274 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.290 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.306 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.322 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.338 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.354 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.371 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.387 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.403 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.419 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.439 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.457 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
私は10Sかそこらと履歴書上のために動いて停止した場合...それは完全に停止させるためにしようとしていますが、どのように理解することはできません、それは間違いなく非常にそれを一貫して行います。
2012-05-04 08:34:33.305 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:33.321 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:35:00.202 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.221 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.234 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:35:00.251 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
私の場合、drawRectがsetNeedsDisplayInRectの後に**最初に**呼び出されたとき、rectは完全境界です(私の理由を尋ねません)、次の呼び出しはsetNeedsDisplayInRectのパラメータとして指定されたrectです。タッチの動きを複数回テストしましたか? –
ほとんどの場合、デバイス上で直接発生します。しかし、指を動かしてから約10秒か15秒待ってからタッチしてもう一度動くと、シミュレータ上でそのようにすることができます。 iPad3のデバイスでは、指が動いている間にも起こります。 Sooo annoying :) – mprivat
私は@ thisを投稿しました(http://stackoverflow.com/questions/9299018/setneedsdisplayinrect-bug-in-ios5)。それは最初の呼び出しでしかないようだった。私は原因/修正を見つけたことはなく、そのレベルのパフォーマンス最適化は必要ないので、ただ前進しました。rect == viewのサイズをテストして描画できませんか?おそらくオプションはありません。 –