0

私のiPhoneアプリケーションには、バックグラウンドでタスクを実行するために作成したセカンダリスレッドがあり、数ミリ秒ごとに、ビューを更新する必要があります(メインスレッドからではありません)。UIViewサブクラスで次のコードを試しました。

 [self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];

これはシミュレーターではうまく機能しますが、私のデバイスでは非常に遅くなります。私が考えることができる唯一のことは、メインスレッドがUIKitの通常のルーチンで行き詰まっていることです。つまり、setNeedsDisplayは、想定されている時間よりもかなり遅れて呼び出されます(約1/2秒後)。これは、他のコードでは、ユーザーの操作に基づいて、すぐにsetNeedsDisplayを呼び出し、ラグなしで正常に動作するためだと思います。セカンダリスレッドでは、ユーザーインターフェイススレッドよりもバックエンドの計算が少なくなります。これは私のアプリケーションでいくつかの非常に悪い視覚効果につながります。

要約すると、この問題を解決するにはどうすればよいですか?


アップデート:

1秒間にx回更新する必要があるビューを通知する別の方法はありますか?それが可能であれば、それは私にとってより良いパフォーマンスになる可能性があります。CADisplayLinkを試しましたが成功しませんでした...

4

1 に答える 1

3

UIが非常に激しくヒットし、呼び出しが大幅に遅れる場合は、UIの更新を少しバッチ処理するか、TableViewの更新のバッチを中心にbeginUpdate / endUpdateを実行してみてください(たとえば)。

私はMonoTouchで同様のことを行っていますが、その大きさの遅れは見られません。私の更新はすべて、アプリと同じ方法でバックグラウンドスレッドからのものです。

または、メインUIがさらにCPU時間を使用する可能性がある場合は、バックグラウンドスレッドの優先度を下げて、それが役立つかどうかを確認してください。

于 2011-03-22T16:26:58.153 に答える