Я переношу приложение, которое я изначально написал, используя акселерометр для 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, нет никаких звонков с nil CMDeviceMotion или другой странностью
3. Я не делаю никакой важной обработки, которая бы блокировала бы все, просто ожидая событий движения и записывая их. Все это отлично работало как делегат для акселерометра
4. данные движения хороши, слишком редко обновляются:)
5. это использует ios 4.2 на ipod touch 4th gen
6. Я искал как можно лучше, не видел объяснений, хотя видел некоторые сообщения о том, что люди часто видят частоту обновления 50 Гц при запросе 60 Гц, что может быть связано.
Следующее, что я попробую, это настроить выделенную очередь для обработки вместо использования текущей очереди, однако я хотел бы узнать, было ли это известным поведением. Я мог понять, почему скорость обновления была узким местом, но не знаю, почему она все равно будет масштабироваться, как показано, если это так.
Опять же, я полагаю, я мог бы перестроить, чтобы использовать NSTimer и делать свой собственный опрос, но я хотел бы понять, почему я это вижу, на случай, если я принципиально неправильно понимаю структуру Core Motion.