実際の頻度のデバイスモーションアップデートが予想より低いが設定でスケールアップ
-
15-11-2019 - |
質問
私が最初に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 actual events per second 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のすべてのコールを追跡していると確信しています。 3.モーションイベントを待ってそれらを録音するだけで、物事をブロックすることになる重要な処理をしていません。これはすべて加速度計のための代議員として完全にうまく機能しました
4.モーションデータは良い、まれに更新されても更新されています:)
5.これはiPod Touch 4th GentでiOS 4.2を使用しています
6. 60Hzを要求するときに50Hzの更新頻度を見ている人のいくつかの報告を見たことがありますが、私は最善を尽くしています。次のことを試してみると、現在のキューを使用する代わりに処理の専用キューを設定していますが、これが既知の動作であるかどうかを確認したいと思います。更新率がどういうわけかボトルネックしたかどうかを理解することができましたが、それがケースだったかどうかのようにそれがスケールアップするのかわかりません。
繰り返しますが、私はNSTIMERを使用して自分のポーリングを使用するために再構築できたと思いますが、私がこれを見ている理由を理解したいのですが、なぜCore Motionフレームワークを誤解しています。
解決
Okay, here's a possible solution:
Number of concurrent operations on NSOperationQueue
are determined by the OS. That means it sometimes can be very few or even 1 operation at a time.
You can explicitly set the number of operations to a certain reasonable number, e.g.
[operationQueue setMaxConcurrentOperationCount:5];
Enjoy.