Фактическая частота обновлений движения устройства ниже ожидалось, но масштабируется с настройкой
-
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];Это работает, но интервал обновления не ведет себя как ожидалось. Я убрал весь код выполнения в методе процесса процесса, за исключением сохранения временных метров, чтобы увидеть, какое значение обновления реального движения. Я проверил этого достаточно, чтобы доказать себе, что это повторяется, даже странный результат для 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. Я уверен, что я отслеживаю каждый звонок процесса, нет никаких звонков, сделанных с Nil Cmdevicemotion или другой странностью
3. Я не делаю никакой значительной обработки, которая блокирует вещи, просто ждала событий движения и записывать их. Это все отлично работало как делегат для акселерометра
4. Данные движения хороши, просто слишком нечасто обновляются :)
5. Это использует iOS 4.2 на iPod Touch 4-й RUN
6. Я искал как можно лучше, не видел объяснения, хотя я видел некоторые сообщения о людях, увидев частоту обновления 50 Гц при запрашивании 60 Гц, которые могут быть связаны.
Следующая вещь, которую я попробую, создает выделенную очередь для обработки, а не используя текущую очередь, однако я хотел видеть, было ли это известное поведение. Я мог бы понять, если скорость обновления была как-то утесна, но не уверена, почему она все равно будет уменьшена, как показано, если это было так.
Опять же, я полагаю, я мог бы восстановить, чтобы использовать NSTIMER и сделать свой собственный опрос, но я хотел бы понять, почему я вижу это, в случае принципиально недоразумения основных структур движения.
Решение
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.