2010-12-05 9 views
0

私は指のスケッチタイプのアプリを書いていて、アプリはiOS 3.0でうまく動作していました。ただし、iOS 4.0以降でアプリを実行すると問題が発生します。具体的には、古いOSよりも新しいOSで約5倍遅いタッチイベントがアプリに届いています。これは間違いなく、私が間に描画する5倍少ないデータポイントをキャプチャしているので、私のアプリが貧弱に描画されます。iOS 4.0でタッチイベントの頻度が低下するのはなぜですか?

iOS4でタッチイベントの頻度を上げる方法に関するアイデアはありますか?

答えて

2

特定のグラフィック操作ではiOS4.xの方が3.xよりも長くなります(2Xから10Xの間のどこかの方が遅くなります)。より長いグラフィックス実行時間は、メインUIスレッドをブロックし、メインスレッド実行ループがユーザ(タッチ)イベントを処理するのに十分な時間を残さないことがある。

drawRectコードをプロファイルして、リフレッシュレートのティックタイムが長くなっているかどうかを確認してください。もしそうなら、あなたのグラフィックスレンダリングのスピードアップや分割を試みるか、より低いフレームレートを試してみてください。

+0

私は描画コードでかなり新しいので、ここで私の一般的な戦略です。私はUIViewをサブクラス化しています。 touches movedメソッドでは、ビューに描画する必要がある点を格納する配列があります。私は、発動時にsetNeedsDisplayを呼び出す間隔0.03のタイマーも作成しました。私はviewDidLoadで次のようにタイマーを宣言しました:\t timer = [NSTimer scheduledTimerWithTimeInterval:0.03ターゲット:セルフセレクタ:@selector(timerFired :) userInfo:nil repeats:YES]; – aloo

+0

これは正しいアプローチですか?またはスレッドがここで実行されている方法で何かが欠けています。別のスレッドを描画してメインスレッドをブロックしないようにすることができます(これにより、より多くのタッチイベントを受け取ることができます)。 – aloo

+1

あなたのタイマー値が正しいかどうかを調べる前に、drawRectコードの時間を調べる必要があります。特定のタイプのCG描画はスレッドセーフですが、UI描画コードは一般的ではありません。 – hotpaw2

-1

メインスレッドを少なくします。

1

ボトルネックがどこにあるかを確認するには、Sharkでコードをプロファイリングする必要があります。おそらく、メインスレッド(ほとんどの場合、タッチに反応して実行されるもの)で実行されるコードの一部が予想よりも長くなってアプリがタッチイベントを受信できなくなる場合があります。

+0

drawRectはメインループで実行されますか? – aloo

+1

はい、 'drawRect'はメインスレッドで実行します –

関連する問題