12

IOS 3 の加速度計を使用して最初に作成したアプリを移植して、新しい IOS 4 モーション機能を組み込みます。

モーションをキャプチャしている間、アプリケーションは他にほとんど何もしません。たとえば、グラフィックスの更新はありません。

以前に使用した加速度計の代わりに、モーションの更新を設定するために次のことを行っています。NSTimer などを使用して独自のポーリングを行うように再構築できることを認識しており、まだそれを追求する可能性があります。

[motionManager setDeviceMotionUpdateInterval:updateInterval];
CMDeviceMotionHandler motionHandler = ^(CMDeviceMotion *motion, NSError *error) {
[self processMotion:motion withError:error];
};

[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];

これは機能しますが、更新間隔が期待どおりに動作しません。実際のモーション更新レートを確認するためにタイムスタンプを保存する以外は、processMotion メソッドのすべての実行コードを削除しました。私はこれを十分にテストして、1/40 の奇妙な結果でさえ、再現可能であることを証明しました。以下の表は、私が見ているものを示しています。

updateInterval 1 秒あたりの実際のイベント数
1.0/20.0 13
1.0/30.0 27
1.0/40.0 27
1.0/50.0 34
1.0/60.0 40
1.0/70.0 57
1.0/90.0 60
1.0/100.0 74

いくつかの注意事項:
1. 更新間隔が適切に設定されていることを確認しており、確認のために設定後に確認しました。

2. processMotion のすべての呼び出しを追跡していると確信しています。nil CMDeviceMotion またはその他の奇妙さで行われている呼び出しはありません

。そしてそれらを記録します。これはすべて、加速度計のデリゲートとして完全に機能しました

4.モーションデータは良好ですが、更新頻度が低すぎます:)

5.これは、iPod touch第4世代

6でios 4.2を使用しています。できる限り検索しました。説明は見られませんでしたが、60hz を要求したときに 50hz の更新頻度が表示されたという報告をいくつか見ましたが、これは関連している可能性があります。

次に試すのは、現在のキューを使用する代わりに、処理専用のキューを設定することですが、これが既知の動作であるかどうかを確認したかったのです。更新レートが何らかの形でボトルネックになっているかどうかは理解できましたが、その場合に示されているようにスケールアップする理由はわかりません.

繰り返しますが、NSTimer を使用して独自のポーリングを行うように再構築できると思いますが、Core Motion フレームワークを根本的に誤解している場合に備えて、なぜこれが表示されるのかを理解したいと思います。

4

1 に答える 1

2

さて、考えられる解決策は次のとおりです。

での同時操作の数はNSOperationQueue、OS によって決定されます。つまり、一度に操作が非常に少ない場合や 1 つの場合さえある場合があります。

操作の数を特定の合理的な数に明示的に設定できます。

[operationQueue setMaxConcurrentOperationCount:5];

楽しみ。

于 2012-01-19T16:49:31.160 に答える